Data::Polymorph - Yet another approach for polymorphism.
Version 0.01
my $poly = Data::Polymorph->new; ## defining external method 'freeze' $poly->define( 'FileHandle' => freeze => sub{ "do{ require Symbol; bless Symbol::gensym(), '".ref($_[0])."'}" } ); $poly->define( "UNIVERSAL" => freeze => sub{ use Data::Dumper; sprintf( 'do{ my %s }', Dumper $_[0]); }); ## it returns `undef' FileHandle->can('freeze'); UNIVERSAL->('freeze'); ### ### applying defined method. ### ## returns "do{ requier Symbol; bless Symbol::gensym(), 'FileHandle'}" $poly->apply( FileHandle->new , 'freeze' );
This module provides gentle way of polymorphic behaviors definition for special cases that aren't original concerns.
Applying this solution dissipates necessity for making an original namespace dirty.
runs_native
## ## If external method "foo" is not defined into the $poly... ## $poly->runs_native(1); $poly->apply($obj, foo => $bar ); # ... same as $obj->foo($bar) $poly->runs_native(0); $poly->apply($obj, foo => $bar ); # ... die
If this value is true and the object uses UNIVERSAL::can when the method is not defined.
UNIVERSAL::can
class_methods
The dictionary of class methods.
type_methods
The dictionary of type methods.
new
$poly = Data::Polymorph->new(); $poly = Data::Polymorph->new( runs_native => 0 ); $poly = Data::Polymorph->new( runs_native => 1 );
Constructs and returns a new instance of this class.
type
$type = $poly->type( 123 ); # returns 'Num'
Returns the type name of the given object. Types are below.
Any Undef Defined Value Num Str Glob Ref ScalarRef HashRef ArrayRef CodeRef RefRef
They seem like Moose Types.
Actually, I designed these types based on the man pages from Moose::Util::TypeConstraints. Because these were not designed for constraint, they never relate with Moose types.
is_type
$poly->is_type('Any') ; # => 1 $poly->is_type('Str') ; # => 1 $poly->is_type('UNIVERSAL') ; # => 0
Returns true if given name is a defined type name. Otherwise, returns false.
super_type
$type = $poly->super_type('Str'); # => Value $type = $poly->super_type('Undef'); # => Any
Returns name of the type which is the super type of the given type name.
class
$type = $poly->class( $obj );
Returns class name or type name of the given object.
define_type_method
$poly->define_type_method('ArrayRef' => 'values' => sub{ @$_[0]}); $poly->define_type_method('HashRef' => 'values' => sub{ values %$_[0]}); $poly->define_type_method('Any' => 'values' => sub{ $_[0] });
Defines a method for the given type.
define_class_method
$poly->define_class_method( 'Class::Name' => 'method' => sub{ # code reference } );
Defines an external method for a given class which can be appliabled by the instance of this class.
define
$poly->define('Class::Name' => 'method' => sub{ ... } ); $poly->define('Undef' => 'method' => sub{ ... } );
Defines a method for a type or a class.
type_method
$meth = $poly->type_method( 'ArrayRef' => 'values' );
Returns a CODE reference which is invoked as the method of given type.
super_type_method
$meth = $poly->super_type_method( 'ArrayRef' => 'values' );
Returns a CODE reference which is invoked as the super method of given type.
class_method
$meth = $poly->class_method( 'A::Class' => 'method' ); ($poly->apply( 'A::Class' => $method ) or sub{ confess "method $method is not defined" } )->( $args .... );
Returns a CODE reference which is invoked as the method of given class.
super_class_method
$super = $poly->super_class_method( 'A::Class' => 'method' ); ($poly->apply( 'A::Class' => $method ) or sub{ confess "method $method is not defined" } )->( $args .... );
Returns a CODE reference which is invoked as the super method of given class.
method
$code = $poly->method( [] => 'values' ); $code = $poly->method( qr{foo} => 'values' ); $code = $poly->method( FileHandle->new => 'values' );
Returns a CODE reference which is invoked as the method of given object.
super_method
$code = $poly->super_method( [] => 'values' ); $code = $poly->super_method( qr{foo} => 'values' ); $code = $poly->super_method( FileHandle->new => 'values' ); $code = $poly->super_method( 'Any' => 'values' ); # always undef
Returns a CODE reference which is invoked as the super method of given object.
apply
$poly->apply( $obj => 'method' => $arg1, $arg1 , $arg3 .... );
Invokes a method which was defined.
super
$poly->super( $obj => 'method' => $arg1, $arg1 , $arg3 .... );
Invokes a super method which was defined..
lieutar, <lieutar at 1dk.jp>
<lieutar at 1dk.jp>
Please report any bugs or feature requests to bug-class-external-method at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Data-Polymorph. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
bug-class-external-method at rt.cpan.org
and...
Even if I am writing strange English because I am not good at English, I'll not often notice the matter. (Unfortunately, these cases aren't testable automatically.)
If you find strange things, please tell me the matter.
You can find documentation for this module with the perldoc command.
perldoc Data::Polymorph
You can also look for information at:
RT: CPAN's request tracker
http://rt.cpan.org/NoAuth/Bugs.html?Dist=Data-Polymorph
AnnoCPAN: Annotated CPAN documentation
http://annocpan.org/dist/Data-Polymorph
CPAN Ratings
http://cpanratings.perl.org/d/Data-Polymorph
Search CPAN
http://search.cpan.org/dist/Data-Polymorph
Copyright 2008 lieutar, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Data::Polymorph, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Data::Polymorph
CPAN shell
perl -MCPAN -e shell install Data::Polymorph
For more information on module installation, please visit the detailed CPAN module installation guide.