The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
Changes.ttl 023
MANIFEST 02
META.yml 12
Makefile.PL 01
README 018
SIGNATURE 7577
lib/RDF/Trine/Error.pm 22
lib/RDF/Trine/Exporter/CSV.pm 22
lib/RDF/Trine/Exporter/RDFPatch.pm 22
lib/RDF/Trine/Graph.pm 22
lib/RDF/Trine/Iterator/Bindings/Materialized.pm 22
lib/RDF/Trine/Iterator/Bindings.pm 22
lib/RDF/Trine/Iterator/Boolean.pm 22
lib/RDF/Trine/Iterator/Graph/Materialized.pm 22
lib/RDF/Trine/Iterator/Graph.pm 22
lib/RDF/Trine/Iterator/JSONHandler.pm 22
lib/RDF/Trine/Iterator/SAXHandler.pm 22
lib/RDF/Trine/Iterator.pm 22
lib/RDF/Trine/Model/Dataset.pm 22
lib/RDF/Trine/Model/StatementFilter.pm 22
lib/RDF/Trine/Model/Union.pm 22
lib/RDF/Trine/Model.pm 33
lib/RDF/Trine/Namespace.pm 22
lib/RDF/Trine/NamespaceMap.pm 22
lib/RDF/Trine/Node/Blank.pm 22
lib/RDF/Trine/Node/Literal.pm 22
lib/RDF/Trine/Node/Nil.pm 22
lib/RDF/Trine/Node/Resource.pm 2112
lib/RDF/Trine/Node/Variable.pm 22
lib/RDF/Trine/Node.pm 22
lib/RDF/Trine/Parser/LineProtocol.pm 22
lib/RDF/Trine/Parser/NQuads.pm 22
lib/RDF/Trine/Parser/NTriples.pm 22
lib/RDF/Trine/Parser/RDFJSON.pm 22
lib/RDF/Trine/Parser/RDFPatch.pm 22
lib/RDF/Trine/Parser/RDFXML.pm 22
lib/RDF/Trine/Parser/RDFa.pm 22
lib/RDF/Trine/Parser/Redland.pm 22
lib/RDF/Trine/Parser/TriG.pm 22
lib/RDF/Trine/Parser/Turtle/Constants.pm 22
lib/RDF/Trine/Parser/Turtle/Lexer.pm 22
lib/RDF/Trine/Parser/Turtle.pm 22
lib/RDF/Trine/Parser.pm 2131
lib/RDF/Trine/Pattern.pm 25
lib/RDF/Trine/Serializer/NQuads.pm 22
lib/RDF/Trine/Serializer/NTriples/Canonical.pm 22
lib/RDF/Trine/Serializer/NTriples.pm 22
lib/RDF/Trine/Serializer/RDFJSON.pm 22
lib/RDF/Trine/Serializer/RDFPatch.pm 22
lib/RDF/Trine/Serializer/RDFXML.pm 22
lib/RDF/Trine/Serializer/TSV.pm 22
lib/RDF/Trine/Serializer/TriG.pm 22
lib/RDF/Trine/Serializer/Turtle.pm 22
lib/RDF/Trine/Serializer.pm 22
lib/RDF/Trine/Statement/Quad.pm 22
lib/RDF/Trine/Statement.pm 22
lib/RDF/Trine/Store/DBI/Pg.pm 22
lib/RDF/Trine/Store/DBI/SQLite.pm 22
lib/RDF/Trine/Store/DBI/mysql.pm 22
lib/RDF/Trine/Store/DBI.pm 22
lib/RDF/Trine/Store/Dydra.pm 22
lib/RDF/Trine/Store/Hexastore.pm 211
lib/RDF/Trine/Store/LanguagePreference.pm 0401
lib/RDF/Trine/Store/Memory.pm 2842
lib/RDF/Trine/Store/Redis.pm 22
lib/RDF/Trine/Store/Redland.pm 22
lib/RDF/Trine/Store/SPARQL.pm 22
lib/RDF/Trine/Store.pm 23
lib/RDF/Trine/VariableBindings.pm 33
lib/RDF/Trine.pm 22
lib/Test/RDF/Trine/Store.pm 1212
t/parser-nquads.t 11
t/parser-turtle-2013.t 12
t/parser-turtle.t 48
t/store-language.t 072
75 files changed (This is a version diff) 267939
@@ -10,6 +10,29 @@
         dcterms:references      <http://kasei.us/code/rdf-trine/#project> .
 
 
+<http://kasei.us/code/files/RDF-Trine-1.013.tar.gz>
+        dcterms:isVersionOf <http://kasei.us/code/rdf-trine/#project> ;
+        dcterms:replaces    <http://kasei.us/code/files/RDF-Trine-1.011.tar.gz> ;
+
+        doap:Version    [
+                        doap:revision     "1.013" ;
+                        doap:created      "2015-02-14" ;
+                        ];
+        asc:changes     [
+                        asc:addition    "Added RDF::Trine::Parser->parse_url method (github issue #119)." ;
+                        asc:addition    "Added RDF::Trine::Store::LanguagePreference class." ;
+                        asc:update      "Update how file URIs are constructed to better deal with windows systems." ;
+                        asc:update      "Improve insertion performance in RDF::Trine::Store::Memory by keeping caching quad SHA1 hashes." ;
+                        asc:update      "Fixed bug in RDF::Trine::Model->size that was only considering triples, not quads." ;
+                        asc:update      "Update triple store tests for expected results when passing in quad patterns with non-nil graphs." ;
+                        asc:update      "Fix get_statements and count_statements when called with quad patterns with non-nil graph." ;
+                        asc:update      "Miscellaneous code and documentation improvements (from Kjetil Kjernsmo via github pull request #116)." ;
+                        asc:update      "Make RDF::Trine::VariableBindings->join more flexible in testing of equality." ;
+                        asc:update      "Simplify coercion of values in RDF::Trine::Node::Resource constructor." ;
+                        asc:update      "Added IRI to list of prereq modules in Makefile.PL." ;
+                        ] .
+
+
 <http://kasei.us/code/files/RDF-Trine-1.012.tar.gz>
         dcterms:isVersionOf <http://kasei.us/code/rdf-trine/#project> ;
         dcterms:replaces    <http://kasei.us/code/files/RDF-Trine-1.011.tar.gz> ;
@@ -85,6 +85,7 @@ lib/RDF/Trine/Store/DBI/Pg.pm
 lib/RDF/Trine/Store/DBI/SQLite.pm
 lib/RDF/Trine/Store/Dydra.pm
 lib/RDF/Trine/Store/Hexastore.pm
+lib/RDF/Trine/Store/LanguagePreference.pm
 lib/RDF/Trine/Store/Memory.pm
 lib/RDF/Trine/Store/Redis.pm
 lib/RDF/Trine/Store/Redland.pm
@@ -1363,6 +1364,7 @@ t/store-hexastore-pattern.t
 t/store-hexastore-storable.t
 t/store-hexastore-triplestore.t
 t/store-hexastore.t
+t/store-language.t
 t/store-memory.t
 t/store-redis.t
 t/store-triple_sql.t
@@ -39,6 +39,7 @@ requires:
   Digest::SHA: 0
   Error: 0
   HTTP::Negotiate: 0
+  IRI: 0
   JSON: 2
   LWP::UserAgent: 0
   List::Util: 1.33
@@ -64,4 +65,4 @@ resources:
   homepage: http://search.cpan.org/dist/RDF-Trine/
   license: http://dev.perl.org/licenses/
   repository: http://github.com/kasei/perlrdf/
-version: '1.012'
+version: '1.013'
@@ -16,6 +16,7 @@ build_requires		'TryCatch'					=> 0;
 
 perl_version		'5.010';
 
+requires			'IRI'						=> 0;
 requires			'Moose'						=> 2;
 requires			'MooseX::ArrayRef'			=> 0;
 requires			'Module::Load::Conditional'	=> 0.38;
@@ -68,6 +68,24 @@ INSTALLATION
 
 VERSION HISTORY
 
+  Version 1.013 (2015-02-14)
+
+     * BUG FIXES
+         	Update how file URIs are constructed to better deal with windows systems.
+         	Fixed bug in RDF::Trine::Model->size that was only considering triples, not quads.
+         	Fix get_statements and count_statements when called with quad patterns with non-nil graph.
+     * NEW FEATURES
+         	Added RDF::Trine::Store::LanguagePreference class.
+         	Added RDF::Trine::Parser->parse_url method (github issue #119).
+     * ENHANCEMENTS
+         	Improve insertion performance in RDF::Trine::Store::Memory by keeping caching quad SHA1 hashes.
+         	Make RDF::Trine::VariableBindings->join more flexible in testing of equality.
+         	Simplify coercion of values in RDF::Trine::Node::Resource constructor.
+     * OTHER
+         	Update triple store tests for expected results when passing in quad patterns with non-nil graphs.
+         	Miscellaneous code and documentation improvements (from Kjetil Kjernsmo via github pull request #116).
+         	Added IRI to list of prereq modules in Makefile.PL.
+
   Version 1.012 (2015-01-15)
 
      * BUG FIXES
@@ -14,11 +14,11 @@ not run its Makefile.PL or Build.PL.
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-SHA1 7f4daef886d0865a648e6a80ce33cf491f3649a7 Changes.ttl
-SHA1 22a368e748a13b1d961d4b069bb52a470669c637 MANIFEST
-SHA1 42431f912be775aad32fb9e6d31448f024de21cb META.yml
-SHA1 a2c5d6f0501dfc7cb72419ea691688c3dd0d7b89 Makefile.PL
-SHA1 1cf1acbe0b6ac5324a05ca1fa9258951acb25986 README
+SHA1 dd03b60d112348ec925e620f85f7f366e5199a2a Changes.ttl
+SHA1 33efc9001d18c64ddefbff3f4ebe1103ae99b923 MANIFEST
+SHA1 d9b9a4b36373f20b6d52ce65967cf2722dd5927c META.yml
+SHA1 dcf2e49ef083a7ada84ab82022549e098bae755d Makefile.PL
+SHA1 da3abac048028327a3717faa8aa8ab608c0eb1b1 README
 SHA1 de1a886d4a10836f9a9f7bfb07c01df6bc14ce1f bin/cliapi
 SHA1 6b887e866f74e6f823724001c49146ee906c558a bin/graph.pl
 SHA1 6b250506c12423fc465c493af38c65ef5b310274 bin/rdf_init_store.pl
@@ -46,71 +46,72 @@ SHA1 95c73873c6c3cb7024614c225c53863e1e90c134 inc/Module/Install/Metadata.pm
 SHA1 a1820d820772de5eb9c190425babf2c29a2caaf7 inc/Module/Install/Scripts.pm
 SHA1 f8b2ae3386f6ba26c33408968a953d450842eade inc/Module/Install/Win32.pm
 SHA1 f302bc703d76299cff243e5b44cecd61aac27b76 inc/Module/Install/WriteAll.pm
-SHA1 29b3ce61c5350163e3fc8f5a810e2e39ead643c9 lib/RDF/Trine.pm
-SHA1 5ce59a0aeb9114a0a2fba52e5e4d3bc095725739 lib/RDF/Trine/Error.pm
-SHA1 806650c0f94c7eae7e7e5607ee7da9394a8f0857 lib/RDF/Trine/Exporter/CSV.pm
-SHA1 32b7150dd7fa10abd0692eeaa9308997bf2f4cd6 lib/RDF/Trine/Exporter/RDFPatch.pm
-SHA1 7c8fcdca7dac822548c11f3f530e177009c82ca1 lib/RDF/Trine/Graph.pm
-SHA1 b6fddb57f7de75b3876145d296c03e958a3c2003 lib/RDF/Trine/Iterator.pm
-SHA1 8554f7ab6cc4b99fd882d2705ff8bfd9290369d2 lib/RDF/Trine/Iterator/Bindings.pm
-SHA1 c4e1038e827cced3237c16c429c1bc1840bc0964 lib/RDF/Trine/Iterator/Bindings/Materialized.pm
-SHA1 64764649f884de8e1f075dd254489c11964775d7 lib/RDF/Trine/Iterator/Boolean.pm
-SHA1 05b75c5bbec048ec0804b7d1602d525840f245b2 lib/RDF/Trine/Iterator/Graph.pm
-SHA1 933406e65da1db6b2c71c0b741deef0f023417fa lib/RDF/Trine/Iterator/Graph/Materialized.pm
-SHA1 9a4fde765b9c22034024f66c59fdaeacb07dc008 lib/RDF/Trine/Iterator/JSONHandler.pm
-SHA1 77418dbdf17b76d8b60184af903f288b4f68887b lib/RDF/Trine/Iterator/SAXHandler.pm
-SHA1 32d1b6e05522fd5c80437e72bd2213e9da79c887 lib/RDF/Trine/Model.pm
-SHA1 709a084986063b47b8e3399b0c953a454a8c9f1e lib/RDF/Trine/Model/Dataset.pm
-SHA1 aef3a844e15b6d6cbfe0e9b553d32b446d56126c lib/RDF/Trine/Model/StatementFilter.pm
-SHA1 c3f1180947f4d9d0a6d934dfb0539156cf11ee9c lib/RDF/Trine/Model/Union.pm
-SHA1 ef70c8998519d89f81d41d87be7abfb3885cbea1 lib/RDF/Trine/Namespace.pm
-SHA1 d54010d22affe0f9c214d449b122b478ef13293f lib/RDF/Trine/NamespaceMap.pm
-SHA1 25f4c3afb793155ef367ff399414fdd4edfa4d54 lib/RDF/Trine/Node.pm
-SHA1 3c813df8ea086ccb6abcffe3473ec0ff280af9f1 lib/RDF/Trine/Node/Blank.pm
-SHA1 872536c93da017968197b9728fc276634250dc3c lib/RDF/Trine/Node/Literal.pm
-SHA1 04b1d1a911ea6114846ef5392beafd9649d89c32 lib/RDF/Trine/Node/Nil.pm
-SHA1 8280fb05510ae6a8dfdb88f02516609da6ebdb53 lib/RDF/Trine/Node/Resource.pm
-SHA1 be3b10825c4be18002fd302609ca466d56966e72 lib/RDF/Trine/Node/Variable.pm
-SHA1 9a48ad55d1c74e788afcc39d6447cbee11d07813 lib/RDF/Trine/Parser.pm
-SHA1 8148bc4aefe2055602ebc6fb0a7398851b1896f4 lib/RDF/Trine/Parser/LineProtocol.pm
-SHA1 97b7449ed1704cb4941d0e74412b53ff09fb7eff lib/RDF/Trine/Parser/NQuads.pm
-SHA1 9b57e8df58eeea6656a2929469952c30cefdf7ad lib/RDF/Trine/Parser/NTriples.pm
-SHA1 329f22228f161beec5eca8739629a8ca81eb8490 lib/RDF/Trine/Parser/RDFJSON.pm
-SHA1 eea44528c102ca0f3c30a0b6a9878797d8792980 lib/RDF/Trine/Parser/RDFPatch.pm
-SHA1 4c817741ee45c361dfcf6db2aeb51ba71ef91288 lib/RDF/Trine/Parser/RDFXML.pm
-SHA1 b49788ba758caeb96effd028c1381e32b6a3dec5 lib/RDF/Trine/Parser/RDFa.pm
-SHA1 ecf5527270e7987873500dafbc0d244761367775 lib/RDF/Trine/Parser/Redland.pm
-SHA1 c8eb08d8a0fe0bbd1f0d437653ab3f0abf333a0b lib/RDF/Trine/Parser/TriG.pm
-SHA1 83b028e989cbbcd31fb25018c278946b372ce01f lib/RDF/Trine/Parser/Turtle.pm
-SHA1 a1a499e5f4968752abbfe88f0936c6175b3ea692 lib/RDF/Trine/Parser/Turtle/Constants.pm
-SHA1 d55824878fa52279e2376a0590396db12a0d6fb8 lib/RDF/Trine/Parser/Turtle/Lexer.pm
+SHA1 530fe7e053077b8d2de1e33542aad0e15eae111f lib/RDF/Trine.pm
+SHA1 299f04fec11de36d2d4a5d7664f2350a09142ed4 lib/RDF/Trine/Error.pm
+SHA1 ee96c9cb2fb91a5c1ddc34d1b7481eb2a576b49a lib/RDF/Trine/Exporter/CSV.pm
+SHA1 3990be30ed0c5f8f52547d59a2fb0353376b2c8e lib/RDF/Trine/Exporter/RDFPatch.pm
+SHA1 dd2099b2cf737acf86f033d89ef3be13a656237b lib/RDF/Trine/Graph.pm
+SHA1 c0938349435197e41b282a7adc4bb4db186cb131 lib/RDF/Trine/Iterator.pm
+SHA1 a74cbf25fac265aa4f34495ef9accadf3fa06931 lib/RDF/Trine/Iterator/Bindings.pm
+SHA1 86c8db2fc7ebe6d8e660ed4cd890b493a66fb061 lib/RDF/Trine/Iterator/Bindings/Materialized.pm
+SHA1 a2418352b25ba291c489a3c014dc194b9a8b939b lib/RDF/Trine/Iterator/Boolean.pm
+SHA1 d103f8880406b88ed9c281bb1c6386e8dd42703b lib/RDF/Trine/Iterator/Graph.pm
+SHA1 559a2269136b09bf17195416fbfaf2250f918b7b lib/RDF/Trine/Iterator/Graph/Materialized.pm
+SHA1 17d8eb6a29d9eea1e88c1912a65a462e04d7db18 lib/RDF/Trine/Iterator/JSONHandler.pm
+SHA1 7025e8d93add05280141e8a2ba5e6a1b90a419e0 lib/RDF/Trine/Iterator/SAXHandler.pm
+SHA1 873615c1273f0e5eec31d7ef830acde82a12deee lib/RDF/Trine/Model.pm
+SHA1 74d37863456c3c23f0c4577ebef446cfaf249764 lib/RDF/Trine/Model/Dataset.pm
+SHA1 94fa65b89d44881d73cce6805178e15ff618ec21 lib/RDF/Trine/Model/StatementFilter.pm
+SHA1 16f70da353190f59aaeea9f47dee04cd58341dff lib/RDF/Trine/Model/Union.pm
+SHA1 6204329ceb1fbf27d83b40d7a36c8d8d02321c5d lib/RDF/Trine/Namespace.pm
+SHA1 2e808567323831a5a46e0fb5efc1f7e590165ac2 lib/RDF/Trine/NamespaceMap.pm
+SHA1 d8ae918b5027c86dbabef2ae029905819b643605 lib/RDF/Trine/Node.pm
+SHA1 ce3d949f20554a28feacbe736edf489908682688 lib/RDF/Trine/Node/Blank.pm
+SHA1 e58a6f3ebcde117545ea89d19b08ad6ecc5a6bda lib/RDF/Trine/Node/Literal.pm
+SHA1 eb9442f017b21f97a96d4c2b46c04f4ec6c68bee lib/RDF/Trine/Node/Nil.pm
+SHA1 97a706ac28c5bf31a85788bcd49fb4b0b398434d lib/RDF/Trine/Node/Resource.pm
+SHA1 2587e7959fc117ecc03b5181a61e2819d461c4a5 lib/RDF/Trine/Node/Variable.pm
+SHA1 7b1cfeeaf94139724b14e7050fcdc8c80a83c690 lib/RDF/Trine/Parser.pm
+SHA1 888f2c0e424b0927791a3790f6b6959eb58130fe lib/RDF/Trine/Parser/LineProtocol.pm
+SHA1 8a520585a44ecc57b33538eff271d94789b4ff47 lib/RDF/Trine/Parser/NQuads.pm
+SHA1 236ce394deb10b278bafa1339de1473bf943e32e lib/RDF/Trine/Parser/NTriples.pm
+SHA1 b2c8c503e213930af9576da84977db9ec224c0e5 lib/RDF/Trine/Parser/RDFJSON.pm
+SHA1 47abd858c07f208129c42c732f1581a81dad63e4 lib/RDF/Trine/Parser/RDFPatch.pm
+SHA1 e4e450fd06ba9f2e9405267b079f49c2e731e327 lib/RDF/Trine/Parser/RDFXML.pm
+SHA1 f0d2845651018a8549818e65dc2668c73b905bb3 lib/RDF/Trine/Parser/RDFa.pm
+SHA1 b3bab408aec380bdb46a5e5849fa526056eff311 lib/RDF/Trine/Parser/Redland.pm
+SHA1 0933c15e22763a100551db323c5307bd36e78102 lib/RDF/Trine/Parser/TriG.pm
+SHA1 68ae95e93be869bac44049667f9cc2550145a644 lib/RDF/Trine/Parser/Turtle.pm
+SHA1 a50a2a73bbadbb62390b82a96d113cffe6152480 lib/RDF/Trine/Parser/Turtle/Constants.pm
+SHA1 0fc0266b2aa5255877d3f5b1313867f714506869 lib/RDF/Trine/Parser/Turtle/Lexer.pm
 SHA1 acaeb13199572b3c2a5f7da0dcd1c85788ea8ec6 lib/RDF/Trine/Parser/Turtle/Token.pm
-SHA1 6ae07d60ec7054f561bbd13c36eb3c75a57e4c10 lib/RDF/Trine/Pattern.pm
-SHA1 aaab704b134b758fdc324105b8d30ab698aa8862 lib/RDF/Trine/Serializer.pm
-SHA1 c72a69ab7ef96c9b36ceb9dd7df3df3d138a3245 lib/RDF/Trine/Serializer/NQuads.pm
-SHA1 642617c1b9dac5893a0ad95860fdf7b3c08bf824 lib/RDF/Trine/Serializer/NTriples.pm
-SHA1 9f9abb3d3e7ce5bf2ee07ed0aa36a92bb6ffcde7 lib/RDF/Trine/Serializer/NTriples/Canonical.pm
-SHA1 dc471a8ffdf64b82fa53fd158dff85110a772e75 lib/RDF/Trine/Serializer/RDFJSON.pm
-SHA1 9a104e8cf667e34e413b518e522091879d4923ee lib/RDF/Trine/Serializer/RDFPatch.pm
-SHA1 eee5fdf6c14765f6bc09a715a16c7f4ec9cdc098 lib/RDF/Trine/Serializer/RDFXML.pm
-SHA1 76c57e002e74c830cb1bf9e482e1dada021664b6 lib/RDF/Trine/Serializer/TSV.pm
-SHA1 aff43035fabbfc0bea50000fd20d10cb90d4cdcb lib/RDF/Trine/Serializer/TriG.pm
-SHA1 e3a2dcf934df6cc1a8e87f9f5a2e2fd0b0913619 lib/RDF/Trine/Serializer/Turtle.pm
-SHA1 bd765fdb508a2c4b7afbdaa7732b54042ad1c5c8 lib/RDF/Trine/Statement.pm
-SHA1 08342e67f4e1c8a1a6c068ebdcf5dc8dbc34b728 lib/RDF/Trine/Statement/Quad.pm
-SHA1 e816d8d1949fbb52a3431072a8b959cd154cbf05 lib/RDF/Trine/Store.pm
-SHA1 ac3381430c772b03467d29e8e044269862a66b9f lib/RDF/Trine/Store/DBI.pm
-SHA1 8029a30a8a5cd8ef8b5f30c4c62bf48d097cc619 lib/RDF/Trine/Store/DBI/Pg.pm
-SHA1 58625fe4c8de8f5d479143f1be3185d9e72eb67f lib/RDF/Trine/Store/DBI/SQLite.pm
-SHA1 86c5960aa54bd5d942b5dd5069d1308f81a3ee58 lib/RDF/Trine/Store/DBI/mysql.pm
-SHA1 adbe639d5a46f410e5da7fd58c4c72c4d63c42c1 lib/RDF/Trine/Store/Dydra.pm
-SHA1 f02937be32b3660ee25175520b11fffc36605bf9 lib/RDF/Trine/Store/Hexastore.pm
-SHA1 70a50062253f14bf5caacf3512c2e8a81cc517f1 lib/RDF/Trine/Store/Memory.pm
-SHA1 4945265e41e1d3a1d3efeb35a20b80a630d99153 lib/RDF/Trine/Store/Redis.pm
-SHA1 013fde3bc16a855fe8b42e53c8964e0bd6c45904 lib/RDF/Trine/Store/Redland.pm
-SHA1 0431e7f40cdf43ccba1cf1a09a42336820bc197e lib/RDF/Trine/Store/SPARQL.pm
-SHA1 f42e2c33d0158ff7024bfde739af5f116219ccf8 lib/RDF/Trine/VariableBindings.pm
-SHA1 b42eeca1184d02de25a2b4660a45ea4aee4b9386 lib/Test/RDF/Trine/Store.pm
+SHA1 2a4c488f8b8b513beea88f0947c9120758732427 lib/RDF/Trine/Pattern.pm
+SHA1 a7d7d13c427fc2359652a4fafb1061014bfe2edb lib/RDF/Trine/Serializer.pm
+SHA1 3d31130df9afbd6909a56ef0edd7c153b93b101f lib/RDF/Trine/Serializer/NQuads.pm
+SHA1 2ed7978980d296ed29596c138519a96b19e18a34 lib/RDF/Trine/Serializer/NTriples.pm
+SHA1 afc8d760a8fdc205b9d9146d1097ca1fb1c9fd34 lib/RDF/Trine/Serializer/NTriples/Canonical.pm
+SHA1 b399c7f70ef9c958ff393ed85f4f9bbec9281fe4 lib/RDF/Trine/Serializer/RDFJSON.pm
+SHA1 765b43b12ebd1821e008dee0e31e03eb4f7e0b99 lib/RDF/Trine/Serializer/RDFPatch.pm
+SHA1 ae1e45a68f7a2fb45da21166ff39f00053480a67 lib/RDF/Trine/Serializer/RDFXML.pm
+SHA1 1c11ac0f0753a9eeb6e004471fe72ac538a4fe56 lib/RDF/Trine/Serializer/TSV.pm
+SHA1 d563c7caa02454d2e01987eb475e7747b6655a46 lib/RDF/Trine/Serializer/TriG.pm
+SHA1 4a1ef45a409fe04519de872e2a769d7e33599bcc lib/RDF/Trine/Serializer/Turtle.pm
+SHA1 d82850695f83caae8e836b4928acbb12ff359f5b lib/RDF/Trine/Statement.pm
+SHA1 93e566893a2e454521bd695587adbc32c4651b78 lib/RDF/Trine/Statement/Quad.pm
+SHA1 225e5ff448adee2bb5cacce2cd26bd543e37fb2d lib/RDF/Trine/Store.pm
+SHA1 3f9abedd55317b313acd3aea07a04a375bc2916e lib/RDF/Trine/Store/DBI.pm
+SHA1 a636f08f460f8c8a3f366450c8b536536b480690 lib/RDF/Trine/Store/DBI/Pg.pm
+SHA1 af5bfc265f816f61dba9fefd74e94f0769b0cc40 lib/RDF/Trine/Store/DBI/SQLite.pm
+SHA1 75d386c22c7ad5f18ac2def6c660c2e6acbaaec5 lib/RDF/Trine/Store/DBI/mysql.pm
+SHA1 6e8b048e685d1bc027adc5883d720143dac613f6 lib/RDF/Trine/Store/Dydra.pm
+SHA1 adf2325d43c14014d9d87b04c25efc16a7696daf lib/RDF/Trine/Store/Hexastore.pm
+SHA1 90e0272108a9874165847f086e2584ddd9600eea lib/RDF/Trine/Store/LanguagePreference.pm
+SHA1 bdabcfa60c113c6dbf7b14bf0ae54d9cfe7b8f83 lib/RDF/Trine/Store/Memory.pm
+SHA1 77f39d6bf8ac72fa63f3ed2582d6b0d5da688d45 lib/RDF/Trine/Store/Redis.pm
+SHA1 c4356fb7ea10d4954bca452b8329e95d058d8fb1 lib/RDF/Trine/Store/Redland.pm
+SHA1 1bffeb6dbe84169e19c55994f48d0d563c5452a9 lib/RDF/Trine/Store/SPARQL.pm
+SHA1 5d3b530a253a9b2e5d875a5ae4760ed8401a230a lib/RDF/Trine/VariableBindings.pm
+SHA1 5d592b18e54face9be981d121ea001438786e7ca lib/Test/RDF/Trine/Store.pm
 SHA1 3d6f8b1b1edbb40c4bae20dfc977fcf67d97ff28 t/00.load.t
 SHA1 403973466abf1be3a25ac53e0e4eeaee06e1a669 t/data/bugs/ttl-with-bom.ttl
 SHA1 171b51b6ee76df5df278cd9b8946edbc2dade2b4 t/data/rdfa/test-sd.nt
@@ -1344,7 +1345,7 @@ SHA1 abfc6f05c46b6b1b145dfaf7d738d01b814fe462 t/node-literal.t
 SHA1 5cbe0ce00dfba2a678288a8480e56f431bb13d09 t/node-resource-i18n.t
 SHA1 ec56a7a2199780e9c597f2ec1c744fd85e34bfd7 t/node-serialization.t
 SHA1 7507f440042de79a54a1d930364c1df08bfd2e0c t/node.t
-SHA1 4dbc6c30f374dcd229c6be60004bf5737664c455 t/parser-nquads.t
+SHA1 def41b76aca94c342a111dbae1963b62c9b65658 t/parser-nquads.t
 SHA1 727a9544c3ba67e528e5156a2c7a50b0cd938086 t/parser-ntriples.t
 SHA1 8ae7768a0341d4d97d5cd7874e793b86cb96b2b3 t/parser-rdfa.t
 SHA1 d46c0650fdfd974b5e10de07080c60622ad6b1f1 t/parser-rdfjson.t
@@ -1352,8 +1353,8 @@ SHA1 a1deaa8ec3eeb7d0b4d2d003a4cbbb5e654cc64f t/parser-rdfpatch.t
 SHA1 fa32fdde16122d4c7380e536382c63f5b72f4aaf t/parser-rdfxml-w3c.t
 SHA1 0c9175c7a2d9a48d5fe70cf74cf34c1c97e7a76a t/parser-redland.t
 SHA1 2967c3dd818866c4595bc245cc15555f32293090 t/parser-trig.t
-SHA1 b83e56b4d118a755cac17b1737b144ef3203a402 t/parser-turtle-2013.t
-SHA1 00529b3c8450bc0533671503295c1db835342a24 t/parser-turtle.t
+SHA1 f3555d217af7ae4acd5c9c961c5b4e1b4177129d t/parser-turtle-2013.t
+SHA1 34a1640f8cb76f62d12cffb45da16ba340cbf464 t/parser-turtle.t
 SHA1 3503fcbb170c4ea4fdf1f4d46eb109d900c806c1 t/parser.t
 SHA1 12f11f0dcfe7b3d9be76c29114854b71d0759247 t/pattern.t
 SHA1 d06dfdb62eb23fe7ae6d69aabda46c07213137a3 t/remove-list.t
@@ -1378,6 +1379,7 @@ SHA1 8cb9666120c08881e3ce3def588488fe81852420 t/store-hexastore-pattern.t
 SHA1 3ad3f71d59ae8dd4dd5ef893130d4afdc6211a83 t/store-hexastore-storable.t
 SHA1 33c8e3f131ebb14a1fece0f5848ffa50d29da62e t/store-hexastore-triplestore.t
 SHA1 546bfe6e7a45a8eb24024a2af8f91b7f507d0508 t/store-hexastore.t
+SHA1 c08fb94c6db89165a8494a46ab5a6f8502cec028 t/store-language.t
 SHA1 5dc3f12174c68a5a067b088b14b9f4e2eb41e8b8 t/store-memory.t
 SHA1 227583a3b48495bf9c2484654bc0872d0f5b35b5 t/store-redis.t
 SHA1 0a6b72ed37ea6ffae0bbe99d369627dcc5fd9642 t/store-triple_sql.t
@@ -1401,7 +1403,7 @@ SHA1 0d59038cf8ba6efd00638de2bcf3c56bbd3e7da1 xt/store-sparql.t
 Version: GnuPG v1
 Comment: GPGTools - http://gpgtools.org
 
-iEYEARECAAYFAlS4WPcACgkQhPK6VMqoyC1EqQCgmBLaay4cWhxeUCybAL/Vf9q+
-IjEAn3YTgNzuJcjUf4Eh9n+YfRdUoYMt
-=+JeR
+iEYEARECAAYFAlTfpFEACgkQhPK6VMqoyC0hpwCdF5QBDItkirwzjezbAwUEHHAf
+rkcAoLjA1mOMOU+DFjAH1OfgyndtMv3N
+=orAf
 -----END PGP SIGNATURE-----
@@ -7,7 +7,7 @@ RDF::Trine::Error - Error classes for RDF::Trine
 
 =head1 VERSION
 
-This document describes RDF::Trine::Error version 1.012
+This document describes RDF::Trine::Error version 1.013
 
 =head1 SYNOPSIS
 
@@ -38,7 +38,7 @@ use base qw(Error);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Exporter::CSV - Export RDF data to CSV
 
 =head1 VERSION
 
-This document describes RDF::Trine::Exporter::CSV version 1.012
+This document describes RDF::Trine::Exporter::CSV version 1.013
 
 =head1 SYNOPSIS
 
@@ -33,7 +33,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =head1 METHODS
@@ -7,7 +7,7 @@ RDF::Trine::Exporter::RDFPatch - RDF-Patch Export
 
 =head1 VERSION
 
-This document describes RDF::Trine::Exporter::RDFPatch version 1.012
+This document describes RDF::Trine::Exporter::RDFPatch version 1.013
 
 =head1 SYNOPSIS
 
@@ -44,7 +44,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Graph - Materialized RDF Graphs for testing isomorphism
 
 =head1 VERSION
 
-This document describes RDF::Trine::Graph version 1.012
+This document describes RDF::Trine::Graph version 1.013
 
 =head1 SYNOPSIS
 
@@ -40,7 +40,7 @@ use Algorithm::Combinatorics qw(permutations);
 our ($VERSION, $debug, $AUTOLOAD);
 BEGIN {
 	$debug		= 0;
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 use overload
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::Bindings::Materialized - Materialized bindings class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::Bindings::Materialized version 1.012
+This document describes RDF::Trine::Iterator::Bindings::Materialized version 1.013
 
 =head1 SYNOPSIS
 
@@ -51,7 +51,7 @@ use Scalar::Util qw(blessed reftype);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =item C<< new ( \@results, \@names, %args ) >>
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::Bindings - Iterator class for bindings query results
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::Bindings version 1.012
+This document describes RDF::Trine::Iterator::Bindings version 1.013
 
 =head1 SYNOPSIS
 
@@ -51,7 +51,7 @@ use Carp qw(croak);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =item C<new ( \@results, \@names, %args )>
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::Boolean - Iterator class for boolean query results
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::Boolean version 1.012
+This document describes RDF::Trine::Iterator::Boolean version 1.013
 
 =head1 SYNOPSIS
 
@@ -38,7 +38,7 @@ use JSON 2.0;
 use base qw(RDF::Trine::Iterator);
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =item C<new ( \@results, %args )>
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::Graph::Materialized - Materialized graph class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::Graph::Materialized version 1.012
+This document describes RDF::Trine::Iterator::Graph::Materialized version 1.013
 
 =head1 SYNOPSIS
 
@@ -48,7 +48,7 @@ use base qw(RDF::Trine::Iterator::Graph);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =item C<< new ( \@results, %args ) >>
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::Graph - Iterator class for graph query results
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::Graph version 1.012
+This document describes RDF::Trine::Iterator::Graph version 1.013
 
 =head1 SYNOPSIS
 
@@ -47,7 +47,7 @@ use base qw(RDF::Trine::Iterator);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::JSONHandler - JSON Handler for parsing SPARQL JSON Results
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::JSONHandler version 1.012
+This document describes RDF::Trine::Iterator::JSONHandler version 1.013
 
 =head1 STATUS
 
@@ -40,7 +40,7 @@ use RDF::Trine::VariableBindings;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 =item C<< new >>
@@ -7,7 +7,7 @@ RDF::Trine::Iterator::SAXHandler - SAX Handler for parsing SPARQL XML Results fo
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator::SAXHandler version 1.012
+This document describes RDF::Trine::Iterator::SAXHandler version 1.013
 
 =head1 STATUS
 
@@ -45,7 +45,7 @@ use RDF::Trine::VariableBindings;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 my %strings;
@@ -7,7 +7,7 @@ RDF::Trine::Iterator - Iterator class for SPARQL query results
 
 =head1 VERSION
 
-This document describes RDF::Trine::Iterator version 1.012.
+This document describes RDF::Trine::Iterator version 1.013.
 
 =head1 SYNOPSIS
 
@@ -43,7 +43,7 @@ use RDF::Trine::Iterator::JSONHandler;
 
 our ($VERSION, @ISA, @EXPORT_OK);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	
 	require Exporter;
 	@ISA		= qw(Exporter);
@@ -7,7 +7,7 @@ RDF::Trine::Model::Dataset - Model for SPARQL datasets
 
 =head1 VERSION
 
-This document describes RDF::Trine::Model::Dataset version 1.012
+This document describes RDF::Trine::Model::Dataset version 1.013
 
 =head1 STATUS
 
@@ -37,7 +37,7 @@ use RDF::Trine::Model;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ################################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Model::StatementFilter - Model for filtering statements based on a u
 
 =head1 VERSION
 
-This document describes RDF::Trine::Model::StatementFilter version 1.012
+This document describes RDF::Trine::Model::StatementFilter version 1.013
 
 =head1 METHODS
 
@@ -33,7 +33,7 @@ use RDF::Trine::Iterator qw(sgrep);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ################################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Model::Union - Union models for joining multiple stores together
 
 =head1 VERSION
 
-This document describes RDF::Trine::Model::Union version 1.012
+This document describes RDF::Trine::Model::Union version 1.013
 
 =head1 METHODS
 
@@ -31,7 +31,7 @@ use RDF::Trine::Store;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ################################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Model - Model class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Model version 1.012
+This document describes RDF::Trine::Model version 1.013
 
 =head1 METHODS
 
@@ -23,7 +23,7 @@ no warnings 'redefine';
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 use Scalar::Util qw(blessed refaddr);
@@ -435,7 +435,7 @@ Returns the number of statements in the model.
 sub size {
 	my $self	= shift;
 	$self->end_bulk_ops();
-	return $self->count_statements();
+	return $self->count_statements(undef, undef, undef, undef);
 }
 
 =item C<< etag >>
@@ -8,7 +8,7 @@ RDF::Trine::Namespace - Abbreviated syntax for constructing RDF node objects
 
 =head1 VERSION
 
-This document describes RDF::Trine::Namespace version 1.012
+This document describes RDF::Trine::Namespace version 1.013
 
 =head1 SYNOPSIS
 
@@ -44,7 +44,7 @@ use base qw(XML::Namespace);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -8,7 +8,7 @@ RDF::Trine::NamespaceMap - Collection of Namespaces
 
 =head1 VERSION
 
-This document describes RDF::Trine::NamespaceMap version 1.012
+This document describes RDF::Trine::NamespaceMap version 1.013
 
 =head1 SYNOPSIS
 
@@ -43,7 +43,7 @@ use Data::Dumper;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Node::Blank - RDF Node class for blank nodes
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node::Blank version 1.012
+This document describes RDF::Trine::Node::Blank version 1.013
 
 =cut
 
@@ -26,7 +26,7 @@ use Carp qw(carp croak confess);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Node::Literal - RDF Node class for literals
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node::Literal version 1.012
+This document describes RDF::Trine::Node::Literal version 1.013
 
 =cut
 
@@ -27,7 +27,7 @@ use Carp qw(carp croak confess);
 
 our ($VERSION, $USE_XMLLITERALS, $USE_FORMULAE);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	eval "use RDF::Trine::Node::Literal::XML;";	## no critic (ProhibitStringyEval)
 	$USE_XMLLITERALS	= (RDF::Trine::Node::Literal::XML->can('new')) ? 1 : 0;
 	eval "use RDF::Trine::Node::Formula;";	## no critic (ProhibitStringyEval)
@@ -7,7 +7,7 @@ RDF::Trine::Node::Nil - RDF Node class for the nil node
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node::Nil version 1.012
+This document describes RDF::Trine::Node::Nil version 1.013
 
 =cut
 
@@ -27,7 +27,7 @@ use Carp qw(carp croak confess);
 my $NIL_NODE;
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Node::Resource - RDF Node class for IRI resources
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node::Resource version 1.012
+This document describes RDF::Trine::Node::Resource version 1.013
 
 =cut
 
@@ -19,6 +19,7 @@ use warnings;
 no warnings 'redefine';
 use base qw(RDF::Trine::Node);
 
+use IRI;
 use URI 1.52;
 use Encode;
 use Data::Dumper;
@@ -29,7 +30,7 @@ use Carp qw(carp croak confess);
 
 our ($VERSION, %sse, %ntriples);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -62,25 +63,15 @@ sub new {
 	}
 	
 	if (defined($base_uri)) {
-		$base_uri	= (blessed($base_uri) and $base_uri->isa('RDF::Trine::Node::Resource')) ? $base_uri->uri_value : "$base_uri";
-		
-		my @chars;
-		my $i	= 0;
-		if ("${base_uri}${uri}" =~ /!/) {
-			# replace occurrences of '!' in $base_uri and $uri with '!(\d)!' and set $chars[$1] = '!'
-			for ($base_uri, $uri) {
-				s/!/$chars[$i] = '!'; sprintf('!%d!', $i++)/eg;
+		if (blessed($base_uri)) {
+			if ($base_uri->isa('RDF::Trine::Node::Resource')) {
+				$base_uri	= IRI->new( $base_uri->uri_value );
 			}
+		} else {
+			$base_uri	= IRI->new($base_uri);
 		}
-		
-		# swap unicode chars for "!${i}!" and add the char to $chars[$i++]
-		for ($uri, $base_uri) {
-			s/([^\x{00}-\x{127}]+)/$chars[$i] = $1; sprintf('!%d!', $i++)/eg;
-		}
-		$uri		= URI->new_abs($uri, $base_uri)->as_string;
-		
-		# put back the unicode characters where they belong
-		$uri =~ s/!(\d+)!/$chars[$1]/eg;
+		my $iri		= IRI->new( value => $uri, base => $base_uri );
+		$uri		= $iri->abs;
 	}
     utf8::upgrade($uri);
 	
@@ -160,8 +151,8 @@ sub sse {
 	if ($sse{ $ra }) {
 		return $sse{ $ra };
 	} else {
-		my $string	= URI->new( $self->uri_value )->canonical;
-		my $sse		= '<' . $string . '>';
+		my $string    = URI->new( $self->uri_value )->canonical;
+		my $sse        = '<' . $string . '>';
 		$sse{ $ra }	= $sse;
 		return $sse;
 	}
@@ -7,7 +7,7 @@ RDF::Trine::Node::Variable - RDF Node class for variables
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node::Variable version 1.012
+This document describes RDF::Trine::Node::Variable version 1.013
 
 =cut
 
@@ -26,7 +26,7 @@ use Carp qw(carp croak confess);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Node - Base class for RDF Nodes
 
 =head1 VERSION
 
-This document describes RDF::Trine::Node version 1.012
+This document describes RDF::Trine::Node version 1.013
 
 =cut
 
@@ -19,7 +19,7 @@ no warnings 'redefine';
 
 our ($VERSION, @ISA, @EXPORT_OK);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	
 	require Exporter;
 	@ISA		= qw(Exporter);
@@ -7,7 +7,7 @@ RDF::Trine::Parser::LineProtocol - RDF LineProtocol Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::LineProtocol version 1.012
+This document describes RDF::Trine::Parser::LineProtocol version 1.013
 
 =head1 SYNOPSIS
 
@@ -36,7 +36,7 @@ use base qw(RDF::Trine::Parser::RDFPatch);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Parser::NQuads - N-Quads Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::NQuads version 1.012
+This document describes RDF::Trine::Parser::NQuads version 1.013
 
 =head1 SYNOPSIS
 
@@ -51,7 +51,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Parser::parser_names{ 'nquads' }	= __PACKAGE__;
 	$RDF::Trine::Parser::format_uris{ 'http://sw.deri.org/2008/07/n-quads/#n-quads' }	= __PACKAGE__;
 	foreach my $ext (qw(nq)) {
@@ -7,7 +7,7 @@ RDF::Trine::Parser::NTriples - N-Triples Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::NTriples version 1.012
+This document describes RDF::Trine::Parser::NTriples version 1.013
 
 =head1 SYNOPSIS
 
@@ -51,7 +51,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Parser::parser_names{ 'ntriples' }	= __PACKAGE__;
 	foreach my $ext (qw(nt)) {
 		$RDF::Trine::Parser::file_extensions{ $ext }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::RDFJSON - RDF/JSON RDF Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::RDFJSON version 1.012
+This document describes RDF::Trine::Parser::RDFJSON version 1.013
 
 =head1 SYNOPSIS
 
@@ -51,7 +51,7 @@ use JSON;
 our ($VERSION, $rdf, $xsd);
 our ($r_boolean, $r_comment, $r_decimal, $r_double, $r_integer, $r_language, $r_lcharacters, $r_line, $r_nameChar_extra, $r_nameStartChar_minus_underscore, $r_scharacters, $r_ucharacters, $r_booltest, $r_nameStartChar, $r_nameChar, $r_prefixName, $r_qname, $r_resource_test, $r_nameChar_test);
 BEGIN {
-	$VERSION				= '1.012';
+	$VERSION				= '1.013';
 	$RDF::Trine::Parser::parser_names{ 'rdfjson' }	= __PACKAGE__;
 	foreach my $ext (qw(json js)) {
 		$RDF::Trine::Parser::file_extensions{ $ext }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::RDFPatch - RDF-Patch Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::RDFPatch version 1.012
+This document describes RDF::Trine::Parser::RDFPatch version 1.013
 
 =head1 SYNOPSIS
 
@@ -46,7 +46,7 @@ use RDF::Trine::Parser::Turtle::Constants;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Parser::RDFXML - RDF/XML Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::RDFXML version 1.012
+This document describes RDF::Trine::Parser::RDFXML version 1.013
 
 =head1 SYNOPSIS
 
@@ -53,7 +53,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION, $HAS_XML_LIBXML);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Parser::parser_names{ 'rdfxml' }	= __PACKAGE__;
 	foreach my $ext (qw(rdf xrdf rdfx)) {
 		$RDF::Trine::Parser::file_extensions{ $ext }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::RDFa - RDFa Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::RDFa version 1.012
+This document describes RDF::Trine::Parser::RDFa version 1.013
 
 =head1 SYNOPSIS
 
@@ -50,7 +50,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION, $HAVE_RDFA_PARSER);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	if (can_load( modules => { 'RDF::RDFa::Parser' => 0.30 })) {
 		$HAVE_RDFA_PARSER	= 1;
 		$RDF::Trine::Parser::parser_names{ 'rdfa' }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::Redland - RDF Parser using the Redland library
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::Redland version 1.012
+This document describes RDF::Trine::Parser::Redland version 1.013
 
 =head1 SYNOPSIS
 
@@ -85,7 +85,7 @@ BEGIN {
 				],
 	);
 	
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	for my $format (keys %FORMATS) {
 		$RDF::Trine::Parser::parser_names{$format} = $FORMATS{$format}[0];
 		$RDF::Trine::Parser::format_uris{ $FORMATS{$format}[1] } = $FORMATS{$format}[0]
@@ -7,7 +7,7 @@ RDF::Trine::Parser::TriG - TriG RDF Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::TriG version 1.012
+This document describes RDF::Trine::Parser::TriG version 1.013
 
 =head1 SYNOPSIS
 
@@ -41,7 +41,7 @@ use RDF::Trine qw(literal);
 
 our ($VERSION);
 BEGIN {
-	$VERSION				= '1.012';
+	$VERSION				= '1.013';
 	$RDF::Trine::Parser::parser_names{ 'trig' }	= __PACKAGE__;
 	foreach my $ext (qw(trig)) {
 		$RDF::Trine::Parser::file_extensions{ $ext }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::Turtle::Constants - Constant definitions for use in parsing
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::Turtle::Constants version 1.012
+This document describes RDF::Trine::Parser::Turtle::Constants version 1.013
 
 =head1 SYNOPSIS
 
@@ -28,7 +28,7 @@ use 5.010;
 our $VERSION;
 our @EXPORT;
 BEGIN {
-	$VERSION				= '1.012';
+	$VERSION				= '1.013';
 	@EXPORT = qw(
 		LBRACKET
 		RBRACKET
@@ -7,7 +7,7 @@ RDF::Trine::Parser::Turtle::Lexer - Tokenizer for parsing Turtle, TriG, and N-Tr
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::Turtle::Lexer version 1.012
+This document describes RDF::Trine::Parser::Turtle::Lexer version 1.013
 
 =head1 SYNOPSIS
 
@@ -35,7 +35,7 @@ use RDF::Trine::Error;
 
 our $VERSION;
 BEGIN {
-	$VERSION				= '1.012';
+	$VERSION				= '1.013';
 }
 
 my $r_nameChar_extra		= qr'[-0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]'o;
@@ -7,7 +7,7 @@ RDF::Trine::Parser::Turtle - Turtle RDF Parser
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser::Turtle version 1.012
+This document describes RDF::Trine::Parser::Turtle version 1.013
 
 =head1 SYNOPSIS
 
@@ -44,7 +44,7 @@ use RDF::Trine::Parser::Turtle::Token;
 
 our $VERSION;
 BEGIN {
-	$VERSION				= '1.012';
+	$VERSION				= '1.013';
 	foreach my $ext (qw(ttl)) {
 		$RDF::Trine::Parser::file_extensions{ $ext }	= __PACKAGE__;
 	}
@@ -7,7 +7,7 @@ RDF::Trine::Parser - RDF Parser class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Parser version 1.012
+This document describes RDF::Trine::Parser version 1.013
 
 =head1 SYNOPSIS
 
@@ -53,7 +53,7 @@ our %format_uris;
 our %encodings;
 
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	can_load( modules => {
 		'Data::UUID'	=> undef,
 		'UUID::Tiny'	=> undef,
@@ -297,6 +297,135 @@ sub parse_url_into_model {
 	}
 }
 
+=item C<< parse_url ( $url, \&handler [, %args] ) >>
+
+Retrieves the content from C<< $url >> and attempts to parse the resulting RDF.
+For each parsed RDF triple that is parsed, C<&handler> will be called with the
+triple as an argument. Otherwise, this method acts just like
+C<parse_url_into_model>.
+
+=cut
+
+sub parse_url {
+	my $class	= shift;
+	my $url		= shift;
+	my $handler	= shift;
+	my %args	= @_;
+	
+	my $base	= $url;
+	if (defined($args{base})) {
+		$base	= $args{base};
+	}
+	
+	my $ua;
+	if (defined($args{useragent})) {
+		$ua	= $args{useragent};
+	} else {
+		$ua		= RDF::Trine->default_useragent->clone;
+		my $accept	= $class->default_accept_header;
+		$ua->default_headers->push_header( 'Accept' => $accept );
+	}
+	
+	my $resp	= $ua->get( $url );
+	if ($url =~ /^file:/) {
+		my $type	= guess_media_type($url);
+		$resp->header('Content-Type', $type);
+	}
+	
+	unless ($resp->is_success) {
+		throw RDF::Trine::Error::ParserError -text => $resp->status_line;
+	}
+	
+	my $content	= $resp->content;
+	if (my $cb = $args{content_cb}) {
+		$cb->( $url, $content, $resp );
+	}
+	
+	my $type	= $resp->header('content-type');
+	$type		=~ s/^([^\s;]+).*/$1/;
+	my $pclass	= $media_types{ $type };
+	if ($pclass and $pclass->can('new')) {
+		my $data	= $content;
+		if (my $e = $encodings{ $pclass }) {
+			$data	= decode( $e, $content );
+		}
+		
+		# pass %args in here too so the constructor can take its pick
+		my $parser	= $pclass->new(%args);
+		my $ok	= 0;
+		try {
+			$parser->parse( $base, $data, $handler );
+			$ok	= 1;
+		} catch RDF::Trine::Error with {};
+		return 1 if ($ok);
+	}
+	
+	### FALLBACK
+	my %options;
+	if (defined $args{canonicalize}) {
+		$options{ canonicalize }	= $args{canonicalize};
+	}
+	
+	my $ok	= 0;
+	try {
+		if ($url =~ /[.](x?rdf|owl)$/ or $content =~ m/\x{FEFF}?<[?]xml /smo) {
+			my $parser	= RDF::Trine::Parser::RDFXML->new(%options);
+			$parser->parse( $base, $content, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]ttl$/ or $content =~ m/@(prefix|base)/smo) {
+			my $parser	= RDF::Trine::Parser::Turtle->new(%options);
+			my $data	= decode('utf8', $content);
+			$parser->parse( $base, $data, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]trig$/) {
+			my $parser	= RDF::Trine::Parser::Trig->new(%options);
+			my $data	= decode('utf8', $content);
+			$parser->parse( $base, $data, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]nt$/) {
+			my $parser	= RDF::Trine::Parser::NTriples->new(%options);
+			$parser->parse( $base, $content, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]nq$/) {
+			my $parser	= RDF::Trine::Parser::NQuads->new(%options);
+			$parser->parse( $base, $content, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]js(?:on)?$/) {
+			my $parser	= RDF::Trine::Parser::RDFJSON->new(%options);
+			$parser->parse( $base, $content, $handler, %args );
+			$ok	= 1;;
+		} elsif ($url =~ /[.]x?html?$/) {
+			my $parser	= RDF::Trine::Parser::RDFa->new(%options);
+			$parser->parse( $base, $content, $handler, %args );
+			$ok	= 1;;
+		} else {
+			my @types	= keys %{ { map { $_ => 1 } values %media_types } };
+			foreach my $pclass (@types) {
+				my $data	= $content;
+				if (my $e = $encodings{ $pclass }) {
+					$data	= decode( $e, $content );
+				}
+				my $parser	= $pclass->new(%options);
+				my $ok		= 0;
+				try {
+					$parser->parse( $base, $data, $handler, %args );
+					$ok	= 1;
+				} catch RDF::Trine::Error::ParserError with {};
+				last if ($ok);
+			}
+		}
+	} catch RDF::Trine::Error with {
+		my $e	= shift;
+	};
+	return 1 if ($ok);
+	
+	if ($pclass) {
+		throw RDF::Trine::Error::ParserError -text => "Failed to parse data of type $type from $url";
+	} else {
+		throw RDF::Trine::Error::ParserError -text => "Failed to parse data from $url";
+	}
+}
+
 =item C<< parse_into_model ( $base_uri, $data, $model [, context => $context] ) >>
 
 Parses the bytes in C<< $data >>, using the given C<< $base_uri >>. For each RDF
@@ -7,7 +7,7 @@ RDF::Trine::Pattern - Class for basic graph patterns
 
 =head1 VERSION
 
-This document describes RDF::Trine::Pattern version 1.012
+This document describes RDF::Trine::Pattern version 1.013
 
 =cut
 
@@ -29,7 +29,7 @@ use RDF::Trine qw(iri);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -200,9 +200,12 @@ merge_patterns >> in that order.
 
 sub sort_for_join_variables {
 	my $self	= shift;
+	return $self if (scalar $self->triples == 1);
+
 	my $class	= ref($self);
 	my $l		= Log::Log4perl->get_logger("rdf.trine.pattern");
 	$l->debug('Reordering ' . scalar $self->triples . ' triples for heuristical optimizations');
+
 	my @sorted_triple_patterns = $self->subgroup;
 
 	my @patterns;
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::NQuads - N-Quads Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::NQuads version 1.012
+This document describes RDF::Trine::Serializer::NQuads version 1.013
 
 =head1 SYNOPSIS
 
@@ -47,7 +47,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'nquads' }	= __PACKAGE__;
 	$RDF::Trine::Serializer::format_uris{ 'http://sw.deri.org/2008/07/n-quads/#n-quads' }	= __PACKAGE__;
 	foreach my $type (qw(text/x-nquads)) {
@@ -4,7 +4,7 @@ RDF::Trine::Serializer::NTriples::Canonical - Canonical representation of an RDF
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::NTriples::Canonical version 1.012
+This document describes RDF::Trine::Serializer::NTriples::Canonical version 1.013
 
 =head1 SYNOPSIS
 
@@ -64,7 +64,7 @@ use base qw(RDF::Trine::Serializer::NTriples);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'ntriples-canonical' }	= __PACKAGE__;
 # 	foreach my $type (qw(text/plain)) {
 # 		$RDF::Trine::Serializer::media_types{ $type }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::NTriples - N-Triples Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::NTriples version 1.012
+This document describes RDF::Trine::Serializer::NTriples version 1.013
 
 =head1 SYNOPSIS
 
@@ -47,7 +47,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'ntriples' }	= __PACKAGE__;
 	$RDF::Trine::Serializer::format_uris{ 'http://www.w3.org/ns/formats/N-Triples' }	= __PACKAGE__;
 	foreach my $type (qw(text/plain)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::RDFJSON - RDF/JSON Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::RDF/JSON version 1.012
+This document describes RDF::Trine::Serializer::RDF/JSON version 1.013
 
 =head1 SYNOPSIS
 
@@ -48,7 +48,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'rdfjson' }	= __PACKAGE__;
 	foreach my $type (qw(application/json application/x-rdf+json)) {
 		$RDF::Trine::Serializer::media_types{ $type }	= __PACKAGE__;
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::RDFPatch - RDF-Patch Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::RDFPatch version 1.012
+This document describes RDF::Trine::Serializer::RDFPatch version 1.013
 
 =head1 SYNOPSIS
 
@@ -49,7 +49,7 @@ use RDF::Trine::Exporter::RDFPatch;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'rdfpatch' }	= __PACKAGE__;
 # 	$RDF::Trine::Serializer::format_uris{ 'http://www.w3.org/ns/formats/RDF-Patch' }	= __PACKAGE__;
 	foreach my $type (qw(application/rdf-patch)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::RDFXML - RDF/XML Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::RDFXML version 1.012
+This document describes RDF::Trine::Serializer::RDFXML version 1.013
 
 =head1 SYNOPSIS
 
@@ -48,7 +48,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'rdfxml' }	= __PACKAGE__;
 	$RDF::Trine::Serializer::format_uris{ 'http://www.w3.org/ns/formats/RDF_XML' }	= __PACKAGE__;
 	foreach my $type (qw(application/rdf+xml)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::TSV - TSV Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store version 1.012
+This document describes RDF::Trine::Store version 1.013
 
 =head1 SYNOPSIS
 
@@ -47,7 +47,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'tsv' }	= __PACKAGE__;
 	$RDF::Trine::Serializer::format_uris{ 'http://www.w3.org/ns/formats/TSV' }	= __PACKAGE__;
 	foreach my $type (qw(text/tsv)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::TriG - TriG Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::TriG version 1.012
+This document describes RDF::Trine::Serializer::TriG version 1.013
 
 =head1 SYNOPSIS
 
@@ -48,7 +48,7 @@ use RDF::Trine::Error qw(:try);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'trig' }	= __PACKAGE__;
 # 	$RDF::Trine::Serializer::format_uris{ 'http://sw.deri.org/2008/07/n-quads/#n-quads' }	= __PACKAGE__;
 # 	foreach my $type (qw(text/x-nquads)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer::Turtle - Turtle Serializer
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer::Turtle version 1.012
+This document describes RDF::Trine::Serializer::Turtle version 1.013
 
 =head1 SYNOPSIS
 
@@ -53,7 +53,7 @@ use RDF::Trine::Namespace qw(rdf);
 our ($VERSION, $debug);
 BEGIN {
 	$debug		= 0;
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	$RDF::Trine::Serializer::serializer_names{ 'turtle' }	= __PACKAGE__;
 	$RDF::Trine::Serializer::format_uris{ 'http://www.w3.org/ns/formats/Turtle' }	= __PACKAGE__;
 	foreach my $type (qw(application/x-turtle application/turtle text/turtle text/rdf+n3)) {
@@ -7,7 +7,7 @@ RDF::Trine::Serializer - RDF Serializer class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Serializer version 1.012
+This document describes RDF::Trine::Serializer version 1.013
 
 =head1 SYNOPSIS
 
@@ -34,7 +34,7 @@ our %serializer_names;
 our %format_uris;
 our %media_types;
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 use RDF::Trine::Serializer::NQuads;
@@ -7,7 +7,7 @@ RDF::Trine::Statement::Quad - Class for quads and quad patterns
 
 =head1 VERSION
 
-This document describes RDF::Trine::Statement::Quad version 1.012
+This document describes RDF::Trine::Statement::Quad version 1.013
 
 =cut
 
@@ -25,7 +25,7 @@ use Carp qw(croak);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -7,7 +7,7 @@ RDF::Trine::Statement - Class for triples and triple patterns
 
 =head1 VERSION
 
-This document describes RDF::Trine::Statement version 1.012
+This document describes RDF::Trine::Statement version 1.013
 
 =cut
 
@@ -29,7 +29,7 @@ use Encode;
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -4,7 +4,7 @@ RDF::Trine::Store::DBI::Pg - PostgreSQL subclass of DBI store
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::DBI::Pg version 1.012
+This document describes RDF::Trine::Store::DBI::Pg version 1.013
 
 =head1 SYNOPSIS
 
@@ -25,7 +25,7 @@ use Scalar::Util qw(blessed reftype refaddr);
 
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 }
@@ -4,7 +4,7 @@ RDF::Trine::Store::DBI::SQLite - SQLite subclass of DBI store
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::DBI::SQLite version 1.012
+This document describes RDF::Trine::Store::DBI::SQLite version 1.013
 
 =head1 SYNOPSIS
 
@@ -34,7 +34,7 @@ use Scalar::Util qw(blessed reftype refaddr);
 
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 }
@@ -4,7 +4,7 @@ RDF::Trine::Store::DBI::mysql - Mysql subclass of DBI store
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::DBI::mysql version 1.012
+This document describes RDF::Trine::Store::DBI::mysql version 1.013
 
 =head1 SYNOPSIS
 
@@ -25,7 +25,7 @@ use Scalar::Util qw(blessed reftype refaddr);
 
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 }
@@ -4,7 +4,7 @@ RDF::Trine::Store::DBI - Persistent RDF storage based on DBI
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::DBI version 1.012
+This document describes RDF::Trine::Store::DBI version 1.013
 
 =head1 SYNOPSIS
 
@@ -65,7 +65,7 @@ use RDF::Trine::Store::DBI::Pg;
 
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 }
@@ -4,7 +4,7 @@ RDF::Trine::Store::Dydra - RDF Store proxy for a Dydra endpoint
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::Dydra version 1.012
+This document describes RDF::Trine::Store::Dydra version 1.013
 
 =head1 SYNOPSIS
 
@@ -38,7 +38,7 @@ use RDF::Trine::Error qw(:try);
 my @pos_names;
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 	@pos_names	= qw(subject predicate object context);
@@ -4,7 +4,7 @@ RDF::Trine::Store::Hexastore - RDF store implemented with the hexastore index
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::Hexastore version 1.012
+This document describes RDF::Trine::Store::Hexastore version 1.013
 
 =head1 SYNOPSIS
 
@@ -46,7 +46,7 @@ use constant OTHERNODES	=> {
 
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 }
@@ -208,6 +208,10 @@ sub get_statements {
 	my %args	= @_;
 	my @orderby	= (ref($args{orderby})) ? @{$args{orderby}} : ();
 	
+	if (defined($context) and not($context->isa('RDF::Trine::Node::Nil'))) {
+		return RDF::Trine::Iterator::Graph->new( [] );
+	}
+	
 	my $defined	= 0;
 	my %variable_map;
 	foreach my $i (0 .. 2) {
@@ -651,6 +655,11 @@ sub count_statements {
 	my @keys	= map { $names[$_], $ids[$_] } (0 .. $#names);
 	my @dkeys;
 	my @ukeys;
+	
+	if (scalar(@nodes) > 3 and defined($nodes[3]) and not($nodes[3]->isa('RDF::Trine::Node::Nil'))) {
+		return 0;
+	}
+	
 	foreach my $i (0 .. 2) {
 		if (defined($nodes[ $i ])) {
 			push( @dkeys, $names[$i] );
@@ -0,0 +1,401 @@
+=encoding utf8
+
+=head1 NAME
+
+RDF::Trine::Store::LanguagePreference - RDF Store proxy for filtering language tagged literals
+
+=head1 VERSION
+
+This document describes RDF::Trine::Store::LanguagePreference version 1.013
+
+=head1 SYNOPSIS
+
+ use RDF::Trine::Store::LanguagePreference;
+
+=head1 DESCRIPTION
+
+RDF::Trine::Store::LanguagePreference provides a RDF::Trine::Store API to
+filter the statements made available from some underlying store object based
+on a users' language preferences (e.g. coming from an Accept-Language HTTP
+header value).
+
+=cut
+
+package RDF::Trine::Store::LanguagePreference;
+
+use strict;
+use warnings;
+no warnings 'redefine';
+use base qw(RDF::Trine::Store);
+
+use Data::Dumper;
+use List::Util qw(reduce max);
+use Scalar::Util qw(refaddr reftype blessed);
+use RDF::Trine::Iterator qw(sgrep);
+
+######################################################################
+
+my @pos_names;
+our $VERSION;
+BEGIN {
+	$VERSION	= "1.013";
+	my $class	= __PACKAGE__;
+	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
+	@pos_names	= qw(subject predicate object context);
+}
+
+######################################################################
+
+=head1 METHODS
+
+Beyond the methods documented below, this class inherits methods from the
+L<RDF::Trine::Store> class.
+
+=over 4
+
+=item C<< new ( $store, { $lang1 => $q1, $lang2 => $q2, ... } ) >>
+
+Returns a new storage object that will act as a proxy for the C<< $store >> object,
+filtering language literals based on the expressed language preferences.
+
+=item C<new_with_config ( $hashref )>
+
+Returns a new storage object configured with a hashref with certain
+keys as arguments.
+
+The C<storetype> key must be C<LanguagePreference> for this backend.
+
+The following key must also be used:
+
+=over
+
+=item C<store>
+
+A configuration hash for the underlying store object.
+
+=item C<preferred_languages>
+
+A hash reference mapping language tags to quality values in the range [0, 1].
+The referent may be changed between operations to change the set of preferred
+languages used in statement matching.
+
+=back
+
+=cut
+
+sub new {
+	my $class	= shift;
+	my $store	= shift;
+	my $pref	= shift;
+	my $self	= bless({
+		store	=> $store,
+		preferred_languages	=> $pref,
+	}, $class);
+	return $self;
+}
+
+=item C<< new_with_config ( \%config ) >>
+
+Returns a new RDF::Trine::Store object based on the supplied configuration hashref.
+
+=cut
+
+sub new_with_config {
+	my $proto	= shift;
+	my $config	= shift;
+	$config->{storetype}	= 'LanguagePreference';
+	return $proto->SUPER::new_with_config( $config );
+}
+
+sub _new_with_config {
+	my $class	= shift;
+	my $config	= shift;
+	return $class->new( @{ $config }{ qw(store preferred_languages) } );
+}
+
+sub _config_meta {
+	return {
+		required_keys	=> [qw(store preferred_languages)],
+		fields			=> {
+			store	=> { description => 'Store config', type => 'string' },
+			preferred_languages => { description => 'Preferred languages', type => 'hash' },
+		}
+	}
+}
+
+
+=item C<< language_preferences >>
+
+Returns a hash of the language preference quality values.
+
+=cut
+
+sub language_preferences {
+	my $self	= shift;
+	return %{ $self->{preferred_languages} };
+}
+
+=item C<< language_preference( $lang ) >>
+
+Return the quality value preference for the given language.
+
+=cut
+
+sub language_preference {
+	my $self	= shift;
+	my $lang	= shift;
+	return $self->{preferred_languages}{$lang};
+}
+
+=item C<< update_language_preference( $lang => $qvalue ) >>
+
+Update the quality value preference for the given language.
+
+=cut
+
+sub update_language_preference {
+	my $self	= shift;
+	my $lang	= shift;
+	my $q		= shift;
+	if ($q == 0) {
+		delete $self->{preferred_languages}{$lang};
+	} else {
+		$self->{preferred_languages}{$lang}	= $q;
+	}
+}
+
+=item C<< get_statements ( $subject, $predicate, $object [, $context] ) >>
+
+Returns a stream object of all statements matching the specified subject,
+predicate and objects. Any of the arguments may be undef to match any value.
+
+=cut
+
+sub get_statements {
+	my $self	= shift;
+	my @nodes	= @_[0..3];
+	my $bound	= 0;
+	my %bound;
+	
+	my $use_quad	= 0;
+	if (scalar(@_) >= 4) {
+		my $g	= $nodes[3];
+		if (blessed($g) and not($g->is_variable) and not($g->is_nil)) {
+			$use_quad	= 1;
+			$bound++;
+			$bound{ 3 }	= $g;
+		}
+	}
+	
+	my @var_map	= qw(s p o g);
+	my %var_map	= map { $var_map[$_] => $_ } (0 .. $#var_map);
+	my @node_map;
+	foreach my $i (0 .. $#nodes) {
+		if (not(blessed($nodes[$i])) or $nodes[$i]->is_variable) {
+			$nodes[$i]	= RDF::Trine::Node::Variable->new( $var_map[ $i ] );
+		}
+	}
+	
+	my $cache	= {};
+	my $iter	= $self->{store}->get_statements(@nodes);
+	return RDF::Trine::Iterator::sgrep(sub {
+		return $self->languagePreferenceAllowsStatement($_, $cache);
+	}, $iter);
+}
+
+=item C<< count_statements ( $subject, $predicate, $object, $context ) >>
+
+Returns a count of all the statements matching the specified subject,
+predicate, object, and context. Any of the arguments may be undef to match any
+value.
+
+=cut
+
+sub count_statements {
+	my $self	= shift;
+	my $iter	= $self->get_statements(@_);
+	my $count	= 0;
+	while ($iter->next) {
+		$count++;
+	}
+	return $count;
+}
+
+=item C<< qvalueForLanguage ( $language, \%cache ) >>
+
+Returns the q-value for C<< $language >> based on the current language
+preference. C<< %cache >> is used across multiple calls to this method for
+performance reasons.
+
+=cut
+
+sub qvalueForLanguage {
+	my $self	= shift;
+	my $lang	= shift;
+	my $cache	= shift || {};
+	if (exists $cache->{$lang}) {
+		return $cache->{$lang};
+	} else {
+		my %q;
+		foreach my $l (keys %{ $self->{preferred_languages} }) {
+			if ($lang =~ /^$l/) {
+				my $q	= $self->{preferred_languages}{$l};
+				$q{$l}	= $q;
+			}
+		}
+		my $q;
+		if (scalar(@{ [ keys %q ] })) {
+			my @keys	= sort { length($b) <=> length($a) } keys %q;
+			$q	= $q{$keys[0]};
+		} else {
+			$q	= 0.001;
+		}
+		$cache->{$lang}	= $q;
+		return $q;
+	}
+}
+
+=item C<< siteQValueForLanguage ( $language ) >>
+
+Returns an implementation-specific q-value preference for the given
+C<< $language >>. This method may be overridden by subclasses to control the
+default preferred language.
+
+=cut
+
+sub siteQValueForLanguage {
+	my $self	= shift;
+	my $lang	= shift;
+	return ($lang =~ /^en/) ? 1.0 : 0.999;
+}
+
+=item C<< availableLanguagesForStatement( $statement ) >>
+
+Returns a list of language tags that are available in the underlying store for
+the given statement object. For example, if C<< $statement >> represented the
+triple:
+
+ dbpedia:Los_Angeles rdf:label "Los Angeles"@en
+
+and the underlying store contains the triples:
+
+ dbpedia:Los_Angeles rdf:label "Los Angeles"@en
+ dbpedia:Los_Angeles rdf:label "ロサンゼルス"@ja
+ dbpedia:Los_Angeles rdf:label "Лос-Анджелес"@ru
+
+then the return value would be C<< ('en', 'ja', 'ru') >>.
+
+=cut
+
+sub availableLanguagesForStatement {
+	my $self	= shift;
+	my $st	= shift;
+	my %languages;
+	my @nodes	= $st->nodes;
+	$nodes[2]	= undef;
+	my $iter	= $self->{store}->get_statements(@nodes);
+	while (my $q = $iter->next) {
+		my $object	= $q->object;
+		if ($object->isa('RDF::Trine::Node::Literal') and $object->has_language) {
+			my $language	= $object->literal_value_language;
+			$languages{$language}++;
+        }
+    }
+    return keys %languages;
+}
+
+=item C<< languagePreferenceAllowsStatement ( $statement, \%cache ) >>
+
+Returns true if the C<< $statement >> is allowed by the current language
+preference. C<< %cache >> is used across multiple calls to this method for
+performance reasons.
+
+=cut
+
+sub languagePreferenceAllowsStatement {
+	my $self	= shift;
+	my $st		= shift;
+	my $cache	= shift;
+	my $object	= $st->object;
+	if ($object->isa('RDF::Trine::Node::Literal') and $object->has_language) {
+		my $language	= $object->literal_value_language;
+		my @availableLanguages	= $self->availableLanguagesForStatement($st);
+		my %availableValues		= map { $_ => $self->qvalueForLanguage($_, $cache) * $self->siteQValueForLanguage($_) } @availableLanguages;
+		my $prefLang	= reduce { $availableValues{$a} > $availableValues{$b} ? $a : $b } keys %availableValues;
+		return ($prefLang eq $language);
+    } else {
+	    return 1;
+	}
+}
+
+
+=item C<< supports ( [ $feature ] ) >>
+
+If C<< $feature >> is specified, returns true if the feature is supported by the
+store, false otherwise. If C<< $feature >> is not specified, returns a list of
+supported features.
+
+=cut
+
+sub supports {
+	my $self	= shift;
+	return;
+}
+
+=begin private
+
+=item C<< can >>
+
+Delegating implementation.
+
+=end private
+
+=cut
+
+sub can {
+	my $proto	= shift;
+	my $name	= shift;
+	my %methods	= map { $_ => 1 } qw(new new_with_config _new_with_config get_statements count_statements);
+	return 1 if exists $methods{$name};
+	if (ref($proto)) {
+		return $proto->{store}->can($name);
+	} else {
+		return;
+	}
+}
+
+sub AUTOLOAD {
+	my $self	= shift;
+	our $AUTOLOAD;
+	return if ($AUTOLOAD =~ /:DESTROY$/);
+	my ($name)	= ($AUTOLOAD =~ m/^.*:(.*)$/);
+	my $store	= $self->{store};
+	unless ($store->can($name)) {
+		my $class	= ref($store);
+		Carp::confess qq[Can't locate object method "$name" via package "$class"];
+	}
+	return $store->$name(@_);
+}
+
+1;
+
+__END__
+
+=back
+
+=head1 BUGS
+
+Please report any bugs or feature requests to through the GitHub web interface
+at L<https://github.com/kasei/perlrdf/issues>.
+
+=head1 AUTHOR
+
+Gregory Todd Williams  C<< <gwilliams@cpan.org> >>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2006-2012 Gregory Todd Williams. This
+program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
@@ -4,7 +4,7 @@ RDF::Trine::Store::Memory - Simple in-memory RDF store
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::Memory version 1.012
+This document describes RDF::Trine::Store::Memory version 1.013
 
 =head1 SYNOPSIS
 
@@ -26,7 +26,7 @@ use base qw(RDF::Trine::Store);
 use Encode;
 use Set::Scalar;
 use Data::Dumper;
-use Digest::SHA;
+use Digest::SHA qw(sha1);
 use List::Util qw(first);
 use Scalar::Util qw(refaddr reftype blessed);
 use RDF::Trine::Statement::Quad;
@@ -39,7 +39,7 @@ use RDF::Trine::Error;
 my @pos_names;
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 	@pos_names	= qw(subject predicate object context);
@@ -118,6 +118,7 @@ sub new {
 		context		=> {},
 		ctx_nodes	=> {},
 		hash		=> Digest::SHA->new,
+		statement_hashes	=> {},
 	}, $class);
 
 	return $self;
@@ -414,31 +415,34 @@ sub add_statement {
 		}
 	}
 	
-	my $count	= $self->count_statements( $st->nodes );
-	if ($count == 0) {
-		$self->{size}++;
-		my $id	= scalar(@{ $self->{ statements } });
-		$self->{hash}->add('+' . encode_utf8($st->as_string));
-		push( @{ $self->{ statements } }, $st );
-		foreach my $pos (0 .. $#pos_names) {
-			my $name	= $pos_names[ $pos ];
-			my $node	= $st->$name();
-			my $string	= $node->as_string;
-			my $set	= $self->{$name}{ $string };
-			unless (blessed($set)) {
-				$set	= Set::Scalar->new();
-				$self->{$name}{ $string }	= $set;
-			}
-			$set->insert( $id );
-		}
-		
-		my $ctx	= $st->context;
-		my $str	= $ctx->as_string;
-		unless (exists $self->{ ctx_nodes }{ $str }) {
-			$self->{ ctx_nodes }{ $str }	= $ctx;
-		}
-# 	} else {
+	my $string	= encode_utf8($st->as_string);
+	my $st_hash	= sha1($string);
+	if ($self->{statement_hashes}{$st_hash}++) {
+		my $count	= $self->count_statements( $st->nodes );
 # 		warn "store already has statement " . $st->as_string;
+		return if $count;
+	}
+	
+	$self->{size}++;
+	my $id	= scalar(@{ $self->{ statements } });
+	$self->{hash}->add('+' . $string);
+	push( @{ $self->{ statements } }, $st );
+	foreach my $pos (0 .. $#pos_names) {
+		my $name	= $pos_names[ $pos ];
+		my $node	= $st->$name();
+		my $string	= $node->as_string;
+		my $set	= $self->{$name}{ $string };
+		unless (blessed($set)) {
+			$set	= Set::Scalar->new();
+			$self->{$name}{ $string }	= $set;
+		}
+		$set->insert( $id );
+	}
+	
+	my $ctx	= $st->context;
+	my $str	= $ctx->as_string;
+	unless (exists $self->{ ctx_nodes }{ $str }) {
+		$self->{ ctx_nodes }{ $str }	= $ctx;
 	}
 	return;
 }
@@ -468,6 +472,16 @@ sub remove_statement {
 		}
 	}
 
+	my $string	= encode_utf8($st->as_string);
+	my $st_hash	= sha1($string);
+	unless (exists $self->{statement_hashes}{$st_hash}) {
+		return;
+	}
+	
+	if (0 == --$self->{statement_hashes}{$st_hash}) {
+		delete $self->{statement_hashes}{$st_hash};
+	}
+	
 	my @nodes	= $st->nodes;
 	my $count	= $self->count_statements( @nodes[ 0..3 ] );
 # 	warn "remove_statement: count of statement is $count";
@@ -475,7 +489,7 @@ sub remove_statement {
 		$self->{size}--;
 		my $id	= $self->_statement_id( $st->nodes );
 # 		warn "removing statement $id: " . $st->as_string . "\n";
-		$self->{hash}->add('-' . encode_utf8($st->as_string));
+		$self->{hash}->add('-' . $string);
 		$self->{statements}[ $id ]	= undef;
 		foreach my $pos (0 .. 3) {
 			my $name	= $pos_names[ $pos ];
@@ -4,7 +4,7 @@ RDF::Trine::Store::Redis - RDF Store for Redis
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::Redis version 1.012
+This document describes RDF::Trine::Store::Redis version 1.013
 
 =head1 SYNOPSIS
 
@@ -44,7 +44,7 @@ our $CACHING	= 1;
 my @pos_names;
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 	@pos_names	= qw(subject predicate object context);
@@ -4,7 +4,7 @@ RDF::Trine::Store::Redland - Redland-backed RDF store for RDF::Trine
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::Redland version 1.012
+This document describes RDF::Trine::Store::Redland version 1.013
 
 =head1 SYNOPSIS
 
@@ -37,7 +37,7 @@ use RDF::Trine::Error;
 our $NIL_TAG;
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 	$NIL_TAG	= 'tag:gwilliams@cpan.org,2010-01-01:RT:NIL';
@@ -4,7 +4,7 @@ RDF::Trine::Store::SPARQL - RDF Store proxy for a SPARQL endpoint
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store::SPARQL version 1.012
+This document describes RDF::Trine::Store::SPARQL version 1.013
 
 =head1 SYNOPSIS
 
@@ -37,7 +37,7 @@ use RDF::Trine::Error qw(:try);
 my @pos_names;
 our $VERSION;
 BEGIN {
-	$VERSION	= "1.012";
+	$VERSION	= "1.013";
 	my $class	= __PACKAGE__;
 	$RDF::Trine::Store::STORE_CLASSES{ $class }	= $VERSION;
 	@pos_names	= qw(subject predicate object context);
@@ -7,7 +7,7 @@ RDF::Trine::Store - RDF triplestore base class
 
 =head1 VERSION
 
-This document describes RDF::Trine::Store version 1.012
+This document describes RDF::Trine::Store version 1.013
 
 =head1 DESCRIPTION
 
@@ -78,12 +78,13 @@ use Module::Load::Conditional qw[can_load];
 use RDF::Trine::Store::Memory;
 use RDF::Trine::Store::Hexastore;
 use RDF::Trine::Store::SPARQL;
+use RDF::Trine::Store::LanguagePreference;
 
 ######################################################################
 
 our ($VERSION, $HAVE_REDLAND, %STORE_CLASSES);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	if ($RDF::Redland::VERSION) {
 		$HAVE_REDLAND	= 1;
 	}
@@ -7,7 +7,7 @@ RDF::Trine::VariableBindings - Variable bindings
 
 =head1 VERSION
 
-This document describes RDF::Trine::VariableBindings version 1.012
+This document describes RDF::Trine::VariableBindings version 1.013
 
 =head1 SYNOPSIS
 
@@ -53,7 +53,7 @@ use Scalar::Util qw(blessed refaddr);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 ######################################################################
@@ -108,7 +108,7 @@ sub join {
 		my $val_a	= $self->{ $key };
 		my $val_b	= $rowb->{ $key };
 		next unless (defined($val_a) and defined($val_b));
-		my $equal	= (refaddr($val_a) == refaddr($val_b)) || $val_a->equal( $val_b );
+		my $equal	= (refaddr($val_a) == refaddr($val_b)) || ($val_a == $val_b) || $val_a->equal( $val_b );
 		unless ($equal) {
 			return;
 		}
@@ -7,7 +7,7 @@ RDF::Trine - An RDF Framework for Perl
 
 =head1 VERSION
 
-This document describes RDF::Trine version 1.012
+This document describes RDF::Trine version 1.013
 
 =head1 SYNOPSIS
 
@@ -89,7 +89,7 @@ use LWP::UserAgent;
 our ($debug, @ISA, $VERSION, @EXPORT_OK);
 BEGIN {
 	$debug		= 0;
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 	
 	require Exporter;
 	@ISA		= qw(Exporter);
@@ -4,7 +4,7 @@ Test::RDF::Trine::Store - A collection of functions to test RDF::Trine::Stores
 
 =head1 VERSION
 
-This document describes RDF::Trine version 1.012
+This document describes RDF::Trine version 1.013
 
 =head1 SYNOPSIS
 
@@ -58,7 +58,7 @@ use RDF::Trine::Namespace qw(xsd);
 
 our ($VERSION);
 BEGIN {
-	$VERSION	= '1.012';
+	$VERSION	= '1.013';
 }
 
 use Log::Log4perl;
@@ -90,7 +90,7 @@ Returns the number of tests run with C<all_triple_store_tests>.
 =cut
 
 sub number_of_triple_tests {
-	return 109;								# Remember to update whenever adding tests
+	return 71;								# Remember to update whenever adding tests
 }
 
 
@@ -227,20 +227,20 @@ sub all_triple_store_tests {
 			$store->get_contexts;
 		} 'get_context lives';
 	
-		add_statement_tests_simple( $store, $args, $ex );
-		update_sleep($args);
-	
-		bulk_add_statement_tests_simple( $store, $args, $ex );
-		update_sleep($args);
+# 		add_statement_tests_simple( $store, $args, $ex );
+# 		update_sleep($args);
+# 	
+# 		bulk_add_statement_tests_simple( $store, $args, $ex );
+# 		update_sleep($args);
 	
 		literals_tests_simple( $store, $args, $ex );
 		blank_node_tests_triples( $store, $args, $ex );
-		count_statements_tests_simple( $store, $args, $ex );
+# 		count_statements_tests_simple( $store, $args, $ex );
 	
 		add_triples( $store, $args, @triples );
 		update_sleep($args);
 	
-		count_statements_tests_triples( $store, $args, $ex, $nil );
+# 		count_statements_tests_triples( $store, $args, $ex, $nil );
 		get_statements_tests_triples( $store, $args, $ex );
 		get_pattern_tests( $store, $args, $ex );
 	}
@@ -682,7 +682,7 @@ sub blank_node_tests_triples {
 
 	{
 		my $count	= $store->count_statements( $blankfoo, undef, undef, $ex->d );
-		is( $count, 1, 'expected one subject-context blank node' );
+		is( $count, 0, 'expected zero subject-context blank node' );
 	}
 
 	{
@@ -979,7 +979,7 @@ sub get_pattern_tests {
 		is( $count, 0, 'get_pattern( bbf, bbu ) expected result count'	 );
 		is( $iter->next, undef, 'pattern iterator end-of-stream' );
 	}
-      }
+}
 
 
 
@@ -32,7 +32,7 @@ isa_ok( $parser, 'RDF::Trine::Parser::NQuads' );
 END
 	$parser->parse_into_model(undef, $nquads, $model);
 	
-	is( $model->size, 2, 'expected model (triple) size after nquads parse' );
+	is( $model->size, 3, 'expected model size after nquads parse' );
 	is( $model->count_statements(undef, undef, undef, undef), 3, 'expected 3 count ffff' );
 	is( $model->count_statements(blank('a'), undef, undef, undef), 2, 'expected 2 count bfff' );
 	is( $model->count_statements(iri('a')), 1, 'expected 1 count bff' );
@@ -55,7 +55,8 @@ foreach my $manifest (@manifests) {
 		}
 		my (undef, undef, $test)	= File::Spec->splitpath( $file );
 		lives_ok {
-			my $url	= 'file://' . $file;
+			my $uri	= URI::file->new($file, (($file =~ m#^\w:\\\\#) ? 'win32' : ()));
+			my $url	= $uri->as_string;
 			my $parser	= RDF::Trine::Parser::Turtle->new();
 			$parser->parse( $url, $data );
 		} $test;
@@ -5,6 +5,7 @@ use Test::Exception;
 use FindBin qw($Bin);
 use File::Glob qw(bsd_glob);
 use File::Spec;
+use URI::file;
 
 use RDF::Trine qw(iri literal);
 use RDF::Trine::Parser;
@@ -15,8 +16,9 @@ my @good	= bsd_glob("${path}/test*.ttl");
 my @bad		= bsd_glob("${path}/bad*.ttl");
 
 {
-	my $file = $good[0];
-	my $base = 'file://' . $file;
+	my $file	= $good[0];
+	my $uri		= URI::file->new($file, (($file =~ m#^\w:\\\\#) ? 'win32' : ()));
+	my $base	= $uri->as_string;
 	my $model = RDF::Trine::Model->temporary_model;
 	RDF::Trine::Parser->parse_file_into_model( $base, $file, $model );
 	is( $model->size, 1, 'parse_file_into_model, guessed from filename' );
@@ -37,7 +39,8 @@ foreach my $file (@good) {
 	my $data	= do { open( my $fh, '<', $file ); local($/) = undef; <$fh> };
 	my (undef, undef, $test)	= File::Spec->splitpath( $file );
 	lives_ok {
-		my $url	= 'file://' . $file;
+		my $uri	= URI::file->new($file, (($file =~ m#^\w:\\\\#) ? 'win32' : ()));
+		my $url	= $uri->as_string;
 		my $parser	= RDF::Trine::Parser::Turtle->new();
 		$parser->parse( $url, $data );
 	} $test;
@@ -48,7 +51,8 @@ foreach my $file (@bad) {
 	my $data	= do { open( my $fh, '<', $file ); local($/) = undef; <$fh> };
 	my (undef, undef, $test)	= File::Spec->splitpath( $file );
 	throws_ok {
-		my $url	= 'file://' . $file;
+		my $uri	= URI::file->new($file, (($file =~ m#^\w:\\\\#) ? 'win32' : ()));
+		my $url	= $uri->as_string;
 		my $parser	= RDF::Trine::Parser::Turtle->new();
 		$parser->parse( $url, $data );
 	} 'RDF::Trine::Error::ParserError', $test;
@@ -0,0 +1,72 @@
+use Test::More;
+use Test::Exception;
+
+use strict;
+use warnings;
+no warnings 'redefine';
+
+use RDF::Trine qw(iri);
+
+my $data	= <<'END';
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://dbpedia.org/class/yago/StatesOfGermany> .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "\u30D9\u30EB\u30EA\u30F3"@ja .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "\u67CF\u6797"@zh .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlino"@it .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlin"@de .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlim"@pt .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlin"@fr .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlin"@en .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berl\u00EDn"@es .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlin"@pl .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlin"@sv .
+<http://dbpedia.org/resource/Berlin> <http://www.w3.org/2000/01/rdf-schema#label> "Berlijn"@nl .
+END
+
+my $parser	= RDF::Trine::Parser->new('ntriples');
+my $store	= RDF::Trine::Store::Memory->new();
+my $model	= RDF::Trine::Model->new($store);
+$parser->parse_into_model("http://dbpedia.org/resource/Berlin", $data, $model);
+
+is($model->size, 12, 'expected model size');
+
+{
+	my $lstore	= RDF::Trine::Store::LanguagePreference->new( $store, {} );
+	my $lmodel	= RDF::Trine::Model->new($lstore);
+	is($lmodel->size, 2, 'expected language model size');
+	my $iter	= $lstore->get_statements(undef, iri('http://www.w3.org/2000/01/rdf-schema#label'), undef);
+	my $count	= 0;
+	while (my $st = $iter->next) {
+		my $o	= $st->object;
+		is($o->literal_value_language, 'en', 'Accept-Language: ');
+		$count++;
+	}
+	is($count, 1, 'expected count');
+}
+
+{
+	my $lstore	= RDF::Trine::Store::LanguagePreference->new( $store, { 'en' => 1.0 } );
+	my $lmodel	= RDF::Trine::Model->new($lstore);
+	my $iter	= $lstore->get_statements(undef, iri('http://www.w3.org/2000/01/rdf-schema#label'), undef);
+	my $count	= 0;
+	while (my $st = $iter->next) {
+		my $o	= $st->object;
+		is($o->literal_value_language, 'en', 'Accept-Language: en;q=1.0');
+		$count++;
+	}
+	is($count, 1, 'expected count');
+}
+
+{
+	my $lstore	= RDF::Trine::Store::LanguagePreference->new( $store, { 'en' => 0.9, 'ja' => 1.0 } );
+	my $lmodel	= RDF::Trine::Model->new($lstore);
+	my $iter	= $lstore->get_statements(undef, iri('http://www.w3.org/2000/01/rdf-schema#label'), undef);
+	my $count	= 0;
+	while (my $st = $iter->next) {
+		my $o	= $st->object;
+		is($o->literal_value_language, 'ja', 'Accept-Language: en;q=0.9, ja;q=1.0');
+		$count++;
+	}
+	is($count, 1, 'expected count');
+}
+
+done_testing();