Skip to content

Instantly share code, notes, and snippets.

@tobyink
Created April 16, 2013 19:48
Show Gist options
  • Select an option

  • Save tobyink/5399010 to your computer and use it in GitHub Desktop.

Select an option

Save tobyink/5399010 to your computer and use it in GitHub Desktop.
use v5.10;
use strict;
use warnings;
BEGIN {
package MySerialization1;
use Role::Tiny;
sub list_char { "," }
sub keyvalue_char { ":" }
around create_child_type => sub {
my $orig = shift;
my $self = shift;
my $r = $self->$orig(@_);
"Role::Tiny"->apply_roles_to_object($r, __PACKAGE__);
return $r;
};
};
BEGIN {
package MySerialization2;
use Role::Tiny;
sub list_char { "," }
sub keyvalue_char { "=>" }
around create_child_type => sub {
my $orig = shift;
my $self = shift;
my $r = $self->$orig(@_);
"Role::Tiny"->apply_roles_to_object($r, __PACKAGE__);
return $r;
};
};
BEGIN {
package MyTypes;
use Type::Library -base, -declare => qw(MyDict1 MyDict2);
use Type::Utils;
use Types::Standard qw(Dict);
use PerlX::Maybe;
declare MyDict1, as Dict,
maybe constraint_generator => Dict->constraint_generator,
maybe name_generator => Dict->name_generator,
maybe inline_generator => Dict->inline_generator,
maybe coercion_generator => Dict->coercion_generator;
"Role::Tiny"->apply_roles_to_object(MyDict1, "MySerialization1");
declare MyDict2, as Dict,
maybe constraint_generator => Dict->constraint_generator,
maybe name_generator => Dict->name_generator,
maybe inline_generator => Dict->inline_generator,
maybe coercion_generator => Dict->coercion_generator;
"Role::Tiny"->apply_roles_to_object(MyDict2, "MySerialization2");
$INC{"MyTypes.pm"} = __FILE__;
};
use MyTypes qw(MyDict1 MyDict2);
use Types::Standard qw(Int);
say MyDict1->keyvalue_char;
say MyDict2->keyvalue_char;
my $sometype = MyDict2[foo => Int];
say $sometype->keyvalue_char;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment