JSORB::Types - A set of Moose types used in JSORB


JSORB documentation Contained in the JSORB distribution.

Index


Code Index:

NAME

Top

JSORB::Types - A set of Moose types used in JSORB

DESCRIPTION

Top

This is basically the type library for JSORB, if you are diving into JSORB at a deeper level you should read the source.

JSORB right now specifically disallows the following types; ScalarRef, CodeRef, RegexpRef, GlobRef and Object. This is primarily because these types are not easily serialziable with JSON. Below is the type tree that JSORB supports and is recommended.

  Unit
  Any
    Item
        Bool
        Maybe[`a]
        Undef
        Defined
            Value
                Num
                    Int
                Str
            Ref
                ArrayRef[`a]
                HashRef[`a]




This includes parameterized ArrayRef[`a] and HashRef[`a] types as well as the Maybe[`a] type. We add one new type, which is the Unit type which is used to represent a void type (Ocaml and Haskell users will recognize this) for use in procedure parameters and return values.

BUGS

Top

All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT.

AUTHOR

Top

Stevan Little <stevan.little@iinteractive.com>

COPYRIGHT AND LICENSE

Top


JSORB documentation Contained in the JSORB distribution.

package JSORB::Types;
use Moose::Util::TypeConstraints;

our $VERSION   = '0.04';
our $AUTHORITY = 'cpan:STEVAN';

# ... for JSORB::Procedure ....

type 'Unit' => where { () };

class_type 'Moose::Meta::TypeConstraint'
    if !find_type_constraint('Moose::Meta::TypeConstraint');

subtype 'JSORB::Spec::Type'
    => as 'Moose::Meta::TypeConstraint'
    => where {
        # these are the types of things that cannot be
        # serialized into JSON so will be neither arguments
        # or return values in our RPC environment.
        ($_->is_a_type_of($_) || return) for map {
            find_type_constraint($_)
        } qw[
            ScalarRef
            CodeRef
            RegexpRef
            GlobRef
            Object
        ]; 1;
    };

subtype 'JSORB::Spec'
    => as 'ArrayRef[JSORB::Spec::Type]'
    => where {
        my $length = scalar @$_;
        # must have at least 2 elements,
        # param and return value
        return unless $length >= 2;
        # if the first item is Unit, then
        # there can only be 2 items
        ($length == 2 || return) if $_->[0]->name eq 'Unit';
        # if there are more than one Unit
        # type that is wrong ...
        return if scalar( grep { $_->name eq 'Unit' } @$_ ) > 2;
        1;
    };

subtype 'JSORB::ParameterSpec'
    => as 'ArrayRef[JSORB::Spec::Type]'
    => where {
        (scalar @$_ == 1 || return) if $_->[0]->name eq 'Unit'; 1;
    };

coerce 'JSORB::Spec'
    => from 'ArrayRef[Str]'
        => via { +[
            map {
                Moose::Util::TypeConstraints::find_or_parse_type_constraint($_)
            } @$_
        ] };

no Moose::Util::TypeConstraints; 1;

__END__