藤 吾郎 > Class-Monadic > Class::Monadic

Download:
Class-Monadic-0.04.tar.gz

Dependencies

Annotate this POD

CPAN RT

Open  1
View/Report Bugs
Module Version: 0.04   Source  

NAME ^

Class::Monadic - Provides monadic methods (a.k.a. singleton methods)

VERSION ^

This document describes Class::Monadic version 0.04.

SYNOPSIS ^

        use Class::Monadic;

        my $ua1 = LWP::UserAgent->new();

        Class::Monadic->initialize($ua1)->add_methods(
                hello => sub{ print "Hello, world!\n" },
        );

        $ua1->hello(); # => Hello, world!

        my $ua2 = LWP::UserAgent->new();

        $ua2->foo(); # throws "Can't locate object method ..."
                     # because foo() is $ua1 specific.

        # import a syntax sugar to make an object monadic
        use Class::Monadic qw(monadic);

        monadic($ua1)->inject_base(qw(SomeComponent OtherComponent));
        # now $ua1 is-a both SomeComponent and OtherComponent

        # per-object fields
        monadic($ua1)->add_fields(qw(x y z));
        $ua1->set_x(42);
        print $ua1->get_x(); # => 42

        # per-object fields with validation
        monadic($ua1)->add_fields(
                foo => qr/^\d+$/,
                bar => [qw(apple banana)],
                qux => \&is_something,
        );

DESCRIPTION ^

Class::Monadic provides per-object classes, monadic classes. It is also known as singleton classes in other languages, e.g. Ruby.

Monadic classes is used in order to define monadic methods, i.e. per-object methods (a.k.a. singleton methods), which are available only at the object they are defined into.

All the meta data that Class::Monadic deals with are outside the object associated with monadic classes, so this module does not depend on the implementation of the object.

INTERFACE ^

Exportable functions

monadic($object)

Specializes $object to have a monadic class, and returns Class::Monadic instance, $meta.

This is a syntax sugar to Class::Monadic->initialize($object).

Class methods

Class::Monadic->initialize($object)

Specializes $object to have a monadic class, and returns Class::Monadic instance, $meta.

Instance methods

$meta->name

Returns the name of the monadic class.

$meta->id

Returns the ID of the monadic class.

Its real class name is $meta->name . '::' . $meta->id;

$meta->add_method(%name_code_pairs)

$meta->add_methods(%name_code_pairs)

Adds methods into the monadic class.

$meta->add_field(@field_names)

$meta->add_fields(@field_names)

Adds field accessors named get_$name/set_$name into the monadic class. Setters are chainable like $obj->set_foo(42)->set_bar(3.14).

These fields are not stored in the object. Rather, stored in its class.

This feature is like what Object::Accessor provides, but Class::Monadic is available for all the classes existing, whereas Object::Accessor is only available in classes that is-a Object::Accessor.

$meta->add_modifier($type, @method_names, $code)

Adds method modifiers to specific methods, using Class::Method::Modifiers::Fast.

$type is must be before, around or after.

Example:

        monadic($obj)->add_modifier(before => foo => sub{ ... });
        monadic($obj)->add_modifier(around => qw(foo bar baz),
                sub{
                        my $next = shift;
                        my(@args) = @_;
                        # ...
                        return &{$next};
                }
        );
        monadic($obj)->add_modifier(after => xyzzy => sub{ ... });

See also Class::Method::Modifiers::Fast.

$meta->inject_base(@component_classes)

Adds @component_classes into the is-a hierarchy of the monadic class.

$meta->bless($another_object)

Copies all the features of $meta into $another_object.

CAVEATS ^

Although you can clone objects with monadic class, you cannot serialize these objects because its monadic features usually includes code references.

Patches are welcome.

DEPENDENCIES ^

Perl 5.8.1 or later.

Data::Util.

Hash::FieldHash.

Class::Method::Modifiers::Fast.

BUGS ^

No bugs have been reported.

Please report any bugs or feature requests to the author.

SEE ALSO ^

Object::Accessor.

Class::Component.

Class::MOP.

AUTHOR ^

Goro Fuji (gfx) <gfuji(at)cpan.org>.

LICENSE AND COPYRIGHT ^

Copyright (c) 2009, Goro Fuji (gfx). Some rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

syntax highlighting: