#!perl
#
# Verify that objectify() is able to convert a "foreign" object into what we
# want, when what we want is Math::BigFloat or subclass thereof.
use strict;
use warnings;
package main;
use Test::More tests => 6;
use Math::BigFloat;
###############################################################################
for my $class ('Math::BigFloat', 'Math::BigFloat::Subclass') {
# This object defines what we want.
my $float = $class -> new(10);
# Create various objects that should work with the object above after
# objectify() has done its thing.
my $float_percent1 = My::Percent::Float1 -> new(100);
is($float * $float_percent1, 10,
qq|\$float = $class -> new(10);|
. q| $float_percent1 = My::Percent::Float1 -> new(100);|
. q| $float * $float_percent1;|);
my $float_percent2 = My::Percent::Float2 -> new(100);
is($float * $float_percent2, 10,
qq|\$float = $class -> new(10);|
. q| $float_percent2 = My::Percent::Float2 -> new(100);|
. q| $float * $float_percent2;|);
my $float_percent3 = My::Percent::Float3 -> new(100);
is($float * $float_percent3, 10,
qq|\$float = $class -> new(10);|
. q| $float_percent3 = My::Percent::Float3 -> new(100);|
. q| $float * $float_percent3;|);
}
###############################################################################
# Class supports as_float(), which returns a Math::BigFloat.
package My::Percent::Float1;
sub new {
my $class = shift;
my $num = shift;
return bless \$num, $class;
}
sub as_float {
my $self = shift;
return Math::BigFloat -> new($$self / 100);
}
###############################################################################
# Class supports as_float(), which returns a scalar.
package My::Percent::Float2;
sub new {
my $class = shift;
my $num = shift;
return bless \$num, $class;
}
sub as_float {
my $self = shift;
return $$self / 100;
}
###############################################################################
# Class does not support as_float().
package My::Percent::Float3;
use overload '""' => sub { $_[0] -> as_string(); };
sub new {
my $class = shift;
my $num = shift;
return bless \$num, $class;
}
sub as_string {
my $self = shift;
return $$self / 100;
}
###############################################################################
package Math::BigFloat::Subclass;
use base 'Math::BigFloat';