Marcel Grünauer > Class-Value > Class::Value

Download:
Class-Value-1.100840.tar.gz

Dependencies

Annotate this POD

Website

View/Report Bugs
Module Version: 1.100840   Source  

NAME ^

Class::Value - Implements the Value Object Design Pattern

VERSION ^

version 1.100840

SYNOPSIS ^

    Class::Value::Boolean->new("Y");      # ok
    Class::Value::Boolean->new("hoge");   # fails 

DESCRIPTION ^

This class, and other classes in its namespace, implement the Value Object Design Pattern. A value object encapsulates its value and adds semantic information. For example, an IPv4 address is not just a string of arbitrary characters. You can detect whether a given string is a well-formed IPv4 address and perform certain operations on it. Value objects provide a consistent interface to do this for all kinds of semantically-enhanced values.

METHODS ^

value

This is the method to use when getting or setting values. It includes the checks for well-formedness and validity. The values of $SkipChecks and $SkipNormalizations are respected.

When skipping checks, we still try to normalize the value, unless told not to by $SkipNormalizations. If we can't normalize it, that is, normalize_value() returns undef, we use the value we were given. We don't try to normalize an undefined value lest some overridden normalize_value() method checks via assert_defined().

Skipping even normalization is useful if you want to purposefully set an denormalized value and later check whether run_checks() properly normalizes it.

If you absolutely need to set an value that will not be validated, use set_value() for that. The value stored by set_value() could be anything - a scalar, array, hash, coderef, another object etc. Specific value objects could also accept various input and decode it into the underlying components.

Consider, for example, a date value class that internally stores year, month and day components, for example using accessors generated by Class::Accessor::Complex. The public interface for the value object would still be value(); outside code never needs to know what's happening behind the scenes. However, outside code could call year(), month() and day() on the value object and get at the components.

The date value class would override set_value() to parse the input and split it into the components. It would also override is_well_formed_value() and/or is_valid_value() to do some checking. And it would override get_value to return the components joined up into a date string. Thus, stringify() would continue to work as expected.

MUNGE_CONSTRUCTOR_ARGS

This is called by the constructor before setting attributes with the constructor's arguments. If the number of arguments is an odd value, it prepends the word value. This allows you to write:

    My::Class::Value->new('my_value');

instead of having to write

    My::Class::Value->new(value => 'my_value');

add

This method is used as the overload handler for the + operation. It can be overridden in subclasses. In this base class it throws an Class::Value::Exception::UnsupportedOperation exception.

atan2

Like add() but affects the atan2 operation.

bit_and

Like add() but affects the & operation.

bit_not

Like add() but affects the ~ operation.

bit_or

Like add() but affects the | operation.

bit_shift_left

Like add() but affects the << operation.

bit_shift_right

Like add() but affects the >> operation.

bit_xor

Like add() but affects the ^ operation.

check

Takes the argument value, if given, or the object's currently set value and checks whether it is well-formed and valid.

comparable

As support for Data::Comparable, this method stringifies the value object. If no value is set, it returns the empty string.

cos

Like add() but affects the cos operation.

divide

Like add() but affects the / operation.

exp

Like add() but affects the exp operation.

get_value

Returns the value object's currently stored value.

int

Like add() but affects the int operation.

is_defined

Returns whether the currently stored value is defined. If there is no value set on the value object, it will return undef.

is_valid

Takes the argument value, if given, or the object's currently set value and checks whether it is valid.

is_valid_normalized_value

Takes a normalized value as an argument and checks whether it is well-formed.

is_valid_value

Takes a value as an argument, normalizes it and checks whether the normalized value is valid. If normalization fails, that is, if it returns undef, then this method will return 0. If the argument value - before normalization - is not defined, this method returns 1, because when no value has been set on the value object yet we don't want it to report an invalid value. If you need a different behaviour, subclass and override this method.

is_well_formed

Takes the argument value, if given, or the object's currently set value and checks whether it is well-formed.

is_well_formed_value

Takes an argument value and checks whether it is well-formed. In this base class, this method always returns 1.

iterate

Like add() but affects the <> operation.

log

Like add() but affects the log operation.

modulo

Like add() but affects the % operation.

multiply

Like add() but affects the * operation.

normalize

Takes an argument value and tries to normalize it. If the normalized value is different from the argument value, it sends out a notification by calling send_notify_value_normalized() - this will most likely be just informational. If normalization failed because normalize_value() returned undef, a different notification is being sent using send_notify_value_invalid().

normalize_value

Takes an argument value and normalizes it. In this base class, the value is returned as is, but in subclasses you could customize this behaviour. For example, in a date-related value object you might accept various date input formats but normalize it to one specific format. Also see Class::Value::Boolean and its superclass Class::Value::Enum as an example.

This method should just normalize the value and return undef if it can't do so. It should not send any notifications; they are handled by normalize().

num_cmp

Like add() but affects the <=> operation.

power

Like add() but affects the ** operation.

run_checks

Takes the argument value, if given, or the object's currently set value and checks whether it is valid and well-formed. The value object's exception container is cleared before those checks so notification delegates can store exceptions in this container.

If only one exception has been recorded and $ThrowSingleException is true then this individual exception will be thrown. Otherwise the whole exception container will be thrown.

run_checks_with_exception_container

Like run_checks(), except that it takes as an additional first argument an exception container object. The exceptions accumulated during the checks are stored in this container. The container will not be thrown. This is useful if you have various value objects and you want to accumulate all exceptions in one big exception container.

The value object's own exception container will be modified during the checks and cleared afterwards.

send_notify_value_invalid

Calls notify_value_invalid() on the notification delegate.

send_notify_value_normalized

Calls notify_value_normalized() on the notification delegate.

send_notify_value_not_wellformed

Calls notify_value_not_wellformed() on the notification delegate.

set_value

Directly sets the argument value on the value object without any checks.

sin

Like add() but affects the sin operation.

skip_checks

You can tell the value object to omit all checks that would be run during value(). If this method is given an argument value, it will set the package-global $SkipChecks. If no argument is given, it will return the current value of $SkipChecks. Note that this is not a per-object setting.

Temporarily skipping checks is useful if you want to set a series of value objects to values that might be invalid, for example when reading them from a data source such as a database or a configuration file, and later call run_checks_with_exception_container() on all of them.

You can use

    Class::Value->skip_checks(1);

to temporarily skip checks, but you have to remember to call

    Class::Value->skip_checks(0);

afterwards. An alternative way would be to bypass this method:

    {
        local $Class::Value::SkipChecks = 1;
        ...
    }

skip_normalizations

Like skip_checks(), but it affects the normalizations that would be done during value().

sqrt

Like add() but affects the sqrt operation.

str_cmp

Like add() but affects the cmp operation.

stringify

Like add() but affects the "" operation.

subtract

Like add() but affects the - operation.

throw_single_exception

Like skip_checks(), but affects $ThrowSingleException.

INSTALLATION ^

See perlmodinstall for information and options on installing Perl modules.

BUGS AND LIMITATIONS ^

No bugs have been reported.

Please report any bugs or feature requests through the web interface at http://rt.cpan.org/Public/Dist/Display.html?Name=Class-Value.

AVAILABILITY ^

The latest version of this module is available from the Comprehensive Perl Archive Network (CPAN). Visit http://www.perl.com/CPAN/ to find a CPAN site near you, or see http://search.cpan.org/dist/Class-Value/.

The development version lives at http://github.com/hanekomu/Class-Value/. Instead of sending patches, please fork this project using the standard git and github infrastructure.

AUTHOR ^

  Marcel Gruenauer <marcel@cpan.org>

COPYRIGHT AND LICENSE ^

This software is copyright (c) 2004 by Marcel Gruenauer.

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

syntax highlighting: