Finance-Robinhood
view release on metacpan or search on metacpan
lib/Finance/Robinhood/Instrument.pm view on Meta::CPAN
package Finance::Robinhood::Instrument;
use 5.010;
use strict;
use warnings;
use Carp;
our $VERSION = "0.21";
use Moo;
use JSON::Tiny qw[decode_json];
use strictures 2;
use namespace::clean;
use Finance::Robinhood::Market;
use Finance::Robinhood::Instrument::Split;
use Finance::Robinhood::Fundamentals;
#
has $_ => (
is => 'lazy',
predicate => 1,
builder => sub {
(caller(1))[3] =~ m[.+::(.+)$];
shift->_get_raw->{$1};
}
)
for (
qw[bloomberg_unique day_trade_ratio min_tick_size margin_initial_ratio
id maintenance_ratio name state symbol tradeable country type]);
#
has $_ => (is => 'ro',
coerce => \&Finance::Robinhood::_2_datetime
) for (qw[list_date]);
has $_ => (is => 'lazy',
predicate => 1,
builder => 1
) for (qw[fundamentals url]);
has $_ => (is => 'lazy',
predicate => 1,
init_arg => undef,
builder => 1
) for (qw[quote market splits]);
has $_ => (is => 'lazy', reader => "_get_$_") for (qw[raw]);
sub _build_raw {
my $s = shift;
my $url;
if ($s->has_url) {
$url = $s->url;
}
elsif ($s->has_id) {
$url = Finance::Robinhood::endpoint('instruments') . $s->id . '/';
}
else {
return {} # We done messed up!
}
my ($status, $result, $raw)
= Finance::Robinhood::_send_request(undef, 'GET', $url);
return $result;
}
sub _build_quote {
return Finance::Robinhood::quote(shift->symbol())->{results}[0];
}
sub historicals {
return Finance::Robinhood::historicals(shift->symbol(), shift, shift);
}
sub _build_splits {
# Upcoming stock splits
my ($status, $result, $raw)
= Finance::Robinhood::_send_request(undef, 'GET',
shift->_get_raw->{'splits'});
return [$result
&& $result->{results} ?
map { Finance::Robinhood::Instrument::Split->new($_) }
@{$result->{results}}
: ()
];
}
sub _build_market {
Finance::Robinhood::Market->new(url => shift->_get_raw->{'market'});
}
sub _build_fundamentals {
Finance::Robinhood::Fundamentals->new(
url => shift->_get_raw->{'fundamentals'});
}
1;
=encoding utf-8
=head1 NAME
Finance::Robinhood::Instrument - Single Financial Instrument
=head1 SYNOPSIS
use Finance::Robinhood::Instrument;
my $apple = Finance::Robinhood::instrument('AAPL');
my $msft = Finance::Robinhood::Instrument->new(id => '50810c35-d215-4866-9758-0ada4ac79ffa');
=head1 DESCRIPTION
This class represents a single financial instrument. Objects are usually
created by Finance::Robinhood so please use
Finance::Robinhood->instrument(...) unless you know the instrument ID.
( run in 1.498 second using v1.01-cache-2.11-cpan-364913b4093 )