Twitter introduced an API change to correct a bug. They were not checking for valid signatures, apparently. POST requests were not generated valid requests. Thanks to Peter Bray for tracking down the exact problem in Net::Twitter::Role::OAuth.
JSON::XS has utf-8 support by default. So, it seemed to be working, but wasn't working, apparently, for users with other backend JSON handlers. Setting the JSON::Any utf8 option *should* resolve the problem.
Bumping the Moose dep should have been sufficient. But I got a bug report via IRC. Looks like someone probably force installed Net::Twitter without upgrading Moose as required. This should make Net::Twitter more robust and run even in spite of that.
Not really necessary, here, but I added one to Net::Twitter::Lite to avoid UKNOWN status reports from cpantesters. Might as well have a load test, here, too.
I thought I was using Class::MOP for a reason, but I added tests and Moose passes, too. So, on perigrins advice ("it'll be more forward compatible"), I'm using Moose.
Added an optional role to inflate Twitter's HASH ref returns to objects. Inflates URLs to URIs, dates to DateTime objects, and add a relative_created_by method whenever the HASH has a created_by element.
JSON::Any 1.21 handles this, now.
This resulted in a failure that had cpantesters reporting lots af "unknown" results. It shouldn't cause much of a problem outside of cpantesters since the JSON::Any requirment *should* pull in a valid JSON handler.
Forked processes can end up with the same rand seed. This technique should avoid any possibility of a collision.
"stringify" was removed in 9f3ae4b, but I failed to remove the documentation for it. It became redundante when "error" and "stringify" simply did the same thing, so I dropped stringify in favor of error.
…f LWP:UA Pod syntax test was getting skipped because the 'eval "TestUA"' wouldn't run with -T. 13_search.t needed lib t/lib.
Subclass Net::Twitter::Core rather than using Net::Twitter->new. Added tests for Net-Twitter user classes: Net::Identica, Net::Twitter::Search, and Net::Twitter::OAuth. Made _create_anon_class a private anonymous sub. Repos version of Moose 0.85 throws a warning when accessors have no associated methods. We'll need the "is => 'bare'" option when its released.
…:Lite) Requiring "authenticate" makes building Net::Twitter::Lite easier, and removes one logic test in API calls at the expense of storing it for every method. <shrug/>
Elimianated the need for caching classes in Net::Twitter; let Moose do it.
Added screen_name and user_id parameters to new_direct_messages. Added the new show_friendship method with a show_relationship alias.
Completely reworked construction by copying much of the MooseX::Traits internals into lib/Net/Twitter.pm and modifying them. Calling Net::Twitter's "new" method now results in an anon class created with supperclasses set to the subclass (if any) and and Net::Twitter::Core. Now, subclasses that use Net::Twitter's "new" method get included in the superclasses so their methods as well as Net::Twitter::Core's can be found. I also duplicated Moose::Meta::Class' anon class caching technique allowing me to check to see if a class is in the cache, first. If not, I create the anon class then make it immutable. It wasn't possible to make the class immutable with MooseX::Traits. (Subclasses aren't made immutable, since they might not be Moose classes.)
This is poor-man's MooseX::StrictConstructor substitute. I need to see if I can make MX::SC work, here. (TODO)
Allow forcing or suppressing an Authorization header on a per-API call basis. APIs are defined with a default "authenticate" value. Individual method definitions can override that value. And, finally, the value can be overridden at runtime by the user. Authorization headers are only sent if the "authenticate" argument to to _authenticated_request is true AND user crendetials (username and password for Basic Authentication; access tokens for OAuth) are present. This will finally allow calling rate_limit_status both authenticated (for per-user rate_limit_status) and un-authenticated (for IP address rate_limit_status).
I flattened oauth_urls in BUILDAGS so the urls become first class attributes instead of members of a HASH ref with custom accessors. I inflate urls to URI objects on read access. I intentionally do not coerce them to URIs and just provide read access because that would result in subtle and perhaps surprising changes. E.g., my $uri = $self->authorization_url; $uri->query_form(oauth_token => $self->request_token); return $uri; Would result in a change to $self->authorization_url. If coerced into URI, I would want the reader to return a clone. This seems easier.